天天看點

Hash算法解決沖突的方法

Hash算法解決沖突的方法一般有以下幾種常用的解決方法

1, 開放定址法:

所謂的開放定址法就是一旦發生了沖突,就去尋找下一個空的散列位址,隻要散清單足夠大,空的散列位址總能找到,并将記錄存入

公式為:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1)

※ 用開放定址法解決沖突的做法是:當沖突發生時,使用某種探測技術在散清單中形成一個探測序列。沿此序列逐個單元地查找,直到找到給定的關鍵字,或者

碰到一個開放的位址(即該位址單元為空)為止(若要插入,在探查到開放的位址,則可将待插入的新結點存人該位址單元)。查找時探測到開放的位址則表明表

中無待查的關鍵字,即查找失敗。

比如說,我們的關鍵字集合為{12,67,56,16,25,37,22,29,15,47,48,34},表長為12。 我們用散列函數f(key) = key mod l2

當計算前S個數{12,67,56,16,25}時,都是沒有沖突的散列位址,直接存入:

Hash算法解決沖突的方法

計算key = 37時,發現f(37) = 1,此時就與25所在的位置沖突。

于是我們應用上面的公式f(37) = (f(37)+1) mod 12 = 2。于是将37存入下标為2的位置:

Hash算法解決沖突的方法

2, 再哈希法:

再哈希法又叫雙哈希法,有多個不同的Hash函數,當發生沖突時,使用第二個,第三個,….,等哈希函數

計算位址,直到無沖突。雖然不易發生聚集,但是增加了計算時間。

3, 鍊位址法:

鍊位址法的基本思想是:每個哈希表節點都有一個next指針,多個哈希表節點可以用next指針構成一個單向連結清單,被配置設定到同一個索引上的多個節點可以用這個單向

連結清單連接配接起來,如:

鍵值對k2, v2與鍵值對k1, v1通過計算後的索引值都為2,這時及産生沖突,但是可以通道next指針将k2, k1所在的節點連接配接起來,這樣就解決了哈希的沖突問題

Hash算法解決沖突的方法

4, 建立公共溢出區:

這種方法的基本思想是:将哈希表分為基本表和溢出表兩部分,凡是和基本表發生沖突的元素,一律填入溢出表