哈希表是種數據結構,它能夠提供快速的插入操做和查找操做。第一次接觸哈希表時,它的優勢多得讓人難以置信。不論哈希表中有多少數據,插入和刪除(有時包括側除)只須要接近常量的時間即0(1)的時間級。實際上,這隻須要幾條機器指令。html
對哈希表的使用者一一人來講,這是一瞬間的事。哈希表運算得很是快,在計算機程序中,若是須要在一秒種內查找上千條記錄一般使用哈希表(例如拼寫檢查器)哈希表的速度明顯比樹快,樹的操做一般須要O(N)的時間級。哈希表不只速度快,編程實現也相對容易。算法
哈希表也有一些缺點它是基於數組的,數組建立後難於擴展某些哈希表被基本填滿時,性能降低得很是嚴重,因此程序雖必需要清楚表中將要存儲多少數據(或者準備好按期地把數據轉移到更大的哈希表中,這是個費時的過程)。編程
並且,也沒有一種簡便的方法能夠以任何一種順序〔例如從小到大〕遍歷表中數據項。若是須要這種能力,就只能選擇其餘數據結構。數組
然而若是不須要有序遍歷數據,井且能夠提早預測數據量的大小。那麼哈希表在速度和易用性方面是無與倫比的。數據結構
哈希表算法-哈希表的概念及做用dom
通常的線性表,樹中,記錄在結構中的相對位置是隨機的,即和記錄的關鍵字之間不存在肯定的關係,所以,在結構中查找記錄時需進行一系列和關鍵字的比較。這一類查找方法創建在「比較「的基礎上,查找的效率依賴於查找過程當中所進行的比較次數。函數
理想的狀況是能直接找到須要的記錄,所以必須在記錄的存儲位置和它的關鍵字之間創建一個肯定的對應關係f,使每一個關鍵字和結構中一個惟一的存儲位置相對應。性能
哈希表最多見的例子是以學生學號爲關鍵字的成績表,1號學生的記錄位置在第一條,10號學生的記錄位置在第10條...htm
若是咱們以學生姓名爲關鍵字,如何創建查找表,使得根據姓名能夠直接找到相應記錄呢?blog
用上述獲得的數值做爲對應記錄在表中的位置,獲得下表:
上面這張表即哈希表。
若是未來要查李秋梅的成績,能夠用上述方法求出該記錄所在位置:
李秋梅:lqm 12+17+13=42 取表中第42條記錄便可。
問題:若是兩個同窗分別叫 劉麗 劉蘭 該如何處理這兩條記錄?
這個問題是哈希表不可避免的,即衝突現象:對不一樣的關鍵字可能獲得同一哈希地址。
哈希表算法-哈希表的構造方法
1、直接定址法
例如:有一個從1到100歲的人口數字統計表,其中,年齡做爲關鍵字,哈希函數取關鍵字自身。
但這種方法效率不高,時間複雜度是O(1),空間複雜度是O(n),n是關鍵字的個數
2、數字分析法
有學生的生日數據以下:
年.月.日
75.10.03
75.11.23
76.03.02
76.07.12
75.04.21
76.02.15
...
經分析,第一位,第二位,第三位重複的可能性大,取這三位形成衝突的機會增長,因此儘可能不取前三位,取後三位比較好。
3、平方取中法
取關鍵字平方後的中間幾位爲哈希地址。
4、摺疊法
將關鍵字分割成位數相同的幾部分(最後一部分的位數能夠不一樣),而後取這幾部分的疊加和(捨去進位)做爲哈希地址,這方法稱爲摺疊法。
例如:每一種西文圖書都有一個國際標準圖書編號,它是一個10位的十進制數字,若要以它做關鍵字創建一個哈希表,當館藏書種類不到10,000時,可採用此法構造一個四位數的哈希函數。若是一本書的編號爲0-442-20586-4,則:
5、除留餘數法
取關鍵字被某個不大於哈希表表長m的數p除後所得餘數爲哈希地址。
H(key)=key MOD p (p<=m)
6、隨機數法
選擇一個隨機函數,取關鍵字的隨機函數值爲它的哈希地址,即
H(key)=random(key) ,其中random爲隨機函數。一般用於關鍵字長度不等時採用此法。
5、除留餘數法
取關鍵字被某個不大於哈希表表長m的數p除後所得餘數爲哈希地址。
H(key)=key MOD p (p<=m)
6、隨機數法
選擇一個隨機函數,取關鍵字的隨機函數值爲它的哈希地址,即
H(key)=random(key) ,其中random爲隨機函數。一般用於關鍵字長度不等時採用此法。
5、除留餘數法
取關鍵字被某個不大於哈希表表長m的數p除後所得餘數爲哈希地址。
H(key)=key MOD p (p<=m)
6、隨機數法
選擇一個隨機函數,取關鍵字的隨機函數值爲它的哈希地址,即
H(key)=random(key) ,其中random爲隨機函數。一般用於關鍵字長度不等時採用此法。
哈希表算法-處理衝突的方法
若是兩個同窗分別叫 劉麗 劉蘭,當加入劉蘭時,地址24發生了衝突,咱們能夠以某種規律使用其它的存儲位置,若是選擇的一個其它位置仍有衝突,則再選下一個,直到找到沒有衝突的位置。選擇其它位置的方法有:
1、開放定址法
Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)
其中m爲表長,di爲增量序列
若是di值可能爲1,2,3,...m-1,稱線性探測再散列。
若是di取值可能爲1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)
稱二次探測再散列。
若是di取值可能爲僞隨機數列。稱僞隨機探測再散列。
例:在長度爲11的哈希表中已填有關鍵字分別爲17,60,29的記錄,現有第四個記錄,其關鍵字爲38,由哈希函數獲得地址爲5,若用線性探測再散列,以下:
2、再哈希法
當發生衝突時,使用第二個、第三個、哈希函數計算地址,直到無衝突時。缺點:計算時間增長。
3、鏈地址法
將全部關鍵字爲同義詞的記錄存儲在同一線性鏈表中。
4、創建一個公共溢出區
假設哈希函數的值域爲[0,m-1],則設向量HashTable[0..m-1]爲基本表,另外設立存儲空間向量OverTable[0..v]用以存儲發生衝突的記錄。