一. 基本概念
哈希表(hash table )是一種根據關鍵字直接訪問內存存儲位置的數據結構,通過哈希表,數據元素的存放位置和數據元素的關鍵字之間建立起某種對應關系,建立這種對應關系的函數稱為哈希函數

二.哈希表的構造方法
假設要存儲的數據元素個數是n,設置一個長度為m(m > n)的連續存儲單元,分別以每個數據元素的關鍵字Ki(0<=i<=n-1)為自變量,通過哈希函數hash(Ki),把Ki映射為內存單元的某個地址hash(Ki),並將數據元素存儲在內存單元中
從數學的角度看,哈希函數實際上是關鍵字到內存單元的映射,因此我們希望通過哈希函數通過盡量簡單的運算使得哈希函數計算出的花溪地址盡量均勻的背影射到一系列的內存單元中,構造哈希函數有三個要點:(1)運算過程要盡量簡單高效,以提高哈希表的插入和檢索效率;(2)哈希函數應該具有較好的散列型,以降低哈希沖突的概率;第三,哈希函數應具有較大的壓縮性,以節省內存。
以下有三種常用方法:
(1)直接地址法:以關鍵字的某個線性函數值為哈希地址,可以表示為hash(K)=aK+C;優點是不會產生沖突,缺點是空間復雜度可能會較高,適用於元素較少的情況
(2)除留余數法:它是由數據元素關鍵字除以某個常數所留的余數為哈希地址,該方法計算簡單,適用范圍廣,是經常使用的一種哈希函數,可以表示為:
hash(K=K mod C;該方法的關鍵是常數的選取,一般要求是接近或等於哈希表本身的長度,研究理論表明,該常數選素數時效果最好
(3)數字分析法:該方法是取數據元素關鍵字中某些取值較均勻的數字來作為哈希地址的方法,這樣可以盡量避免沖突,但是該方法只適合於所有關鍵字已知的情況,對於想要設計出更加通用的哈希表並不適用
三.哈希沖突的解決方案
在構造哈希表時,存在這樣的問題:對於兩個不同的關鍵字,通過我們的哈希函數計算哈希地址時卻得到了相同的哈希地址,我們將這種現象稱為哈希沖突

哈希沖突主要與兩個因素有關,(1)填裝因子,填裝因子是指哈希表中已存入的數據元素個數與哈希地址空間的大小的比值,a=n/m ; a越小,沖突的可能性就越小,相反則沖突可能性較大;但是a越小空間利用率也就越小,a越大,空間利用率越高,為了兼顧哈希沖突和存儲空間利用率,通常將a控制在0.6-0.9之間,而.net中的HashTable則直接將a的最大值定義為0.72 (雖然微軟官方MSDN中聲明HashTable默認填裝因子為1.0,但實際上都是0.72的倍數),(2)與所用的哈希函數有關,如果哈希函數得當,就可以使哈希地址盡可能的均勻分布在哈希地址空間上,從而減少沖突的產生,但一個良好的哈希函數的得來很大程度上取決於大量的實踐,不過幸好前人已經總結實踐了很多高效的哈希函數,可以參考大神Lucifer文章:數據結構:HahTable: http://www.cnblogs.com/lucifer1982/archive/2008/06/18/1224319.html
哈希沖突通常是很難避免的,解決哈希沖突有很多種方法,通常分為兩大類:
1.開放地址法,他是一類以發生哈希沖突的哈希地址為自變量,通過某種哈希函數得到一個新的空閑內存單元地址的方法,開放地址法的哈希沖突函數通常是一組

2.鏈表法:當未發生沖突時,直接存放數據,當沖突產生時,把產生沖突的數據元素另外存放在單鏈表中

先講這么多吧,之后找時間將哈希表實現原理再寫上
