Hash衝突的線性探測開放地址法

在實際應用中,不管如何構造哈希函數,衝突是沒法徹底避免的。函數

開放地址法

這個方法的基本思想是:當發生地址衝突時,按照某種方法繼續探測哈希表中的其餘存儲單元,直到找到空位置爲止。這個過程可用下式描述: 
H i ( key ) = ( H ( key )+ d i ) mod m ( i = 1,2,…… , k ( k ≤ m – 1)) 
其中: H ( key ) 爲關鍵字 key 的直接哈希地址, m 爲哈希表的長度, di 爲每次再探測時的地址增量。 
採用這種方法時,首先計算出元素的直接哈希地址 H ( key ) ,若是該存儲單元已被其餘元素佔用,則繼續查看地址爲 H ( key ) + d 2 的存儲單元,如此重複直至找到某個存儲單元爲空時,將關鍵字爲 key 的數據元素存放到該單元。 
增量 d 能夠有不一樣的取法,並根據其取法有不一樣的稱呼: 
( 1 ) d i = 1 , 2 , 3 , …… 線性探測再散列; 
( 2 ) d i = 1^2 ,- 1^2 , 2^2 ,- 2^2 , k^2, -k^2…… 二次探測再散列; 
( 3 ) d i = 僞隨機序列 僞隨機再散列;spa

例1設有哈希函數 H ( key ) = key mod 7 ,哈希表的地址空間爲 0 ~ 6 ,對關鍵字序列( 32 , 13 , 49 , 55 , 22 , 38 , 21 )按線性探測再散列和二次探測再散列的方法分別構造哈希表。 
解: 
( 1 )線性探測再散列: 
32 % 7 = 4 ; 13 % 7 = 6 ; 49 % 7 = 0 ; 
55 % 7 = 6 發生衝突,下一個存儲地址( 6 + 1 )% 7 = 0 ,仍然發生衝突,再下一個存儲地址:( 6 + 2 )% 7 = 1 未發生衝突,能夠存入。 
22 % 7 = 1 發生衝突,下一個存儲地址是:( 1 + 1 )% 7 = 2 未發生衝突; 
38 % 7 = 3 ; 
21 % 7 = 0 發生衝突,按照上面方法繼續探測直至空間 5 ,不發生衝突,所獲得的哈希表對應存儲位置: 
下標: 0 1 2 3 4 5 6 
49 55 22 38 32 21 13 
( 2 )二次探測再散列: 
下標: 0 1 2 3 4 5 6 
49 22 21 38 32 55 13 
注意:對於利用開放地址法處理衝突所產生的哈希表中刪除一個元素時須要謹慎,不能直接地刪除,由於這樣將會截斷其餘具備相同哈希地址的元素的查找地址,因此,一般採用設定一個特殊的標誌以示該元素已被刪除(由於各類開放地址法中,空地址單元(即開放地址)都是查找失敗的條件)。方法

例子

已知一個線性表(38,25,74,63,52,48),假定採用h(k)=k%6計算散列地址進行散列存儲,若用線性探測的開放定址法處理衝突,則在該散列表上進行查找的平均查找長度爲()。 
A. 1.5 B. 1.7 C. 2 D. 2.3 二、 
解題過程: 
(1)計算h(k): 38%6 = 2 25%6 = 1 74%6 = 2 63%6 = 3 52%6 = 4 48%6 = 0 
(2)定址: 把不衝突的和衝突的所有列出來便可 地址: 0 1 2 3 4 5 
一、線性表第1個元素(38): 38(第1 次不衝突) 
二、線性表第2個元素(25): 25(第1次不衝突) 
三、線性表第3個元素(74): 74(第1 次衝突,地址 + 1) 
四、線性表第3個元素(74): 74(第2 次不衝突) 
五、線性表第4個元素(63): 63(第1 次衝突,地址 + 1) 
六、線性表第4個元素(63): 63(第2 次不衝突) 
七、線性表第5個元素(52): 52(第1 次衝突,地址 + 1) 
八、線性表第5個元素(52): 52(第2 次不衝突) 
九、線性表第6個元素(48): 48(第1次不衝突) 
通過上述定址過程,線性表中的各個元素都有了惟一的地址。 
2.三、結果 線性表中的 6 個元素,通過9次定址, 在該散列表上進行查找的平均查找長度爲:9/6 = 1.5, 答案選:A數據

相關文章
相關標籤/搜索