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}時,都是沒有衝突的散列地址,直接存入: 算法

這裏寫圖片描述 
計算key = 37時,發現f(37) = 1,此時就與25所在的位置衝突。 
因而咱們應用上面的公式f(37) = (f(37)+1) mod 12 = 2。因而將37存入下標爲2的位置: 
這裏寫圖片描述函數

2, 再哈希法: 
再哈希法又叫雙哈希法,有多個不一樣的Hash函數,當發生衝突時,使用第二個,第三個,….,等哈希函數
計算地址,直到無衝突。雖然不易發生彙集,可是增長了計算時間。指針

3, 鏈地址法: 
鏈地址法的基本思想是:每一個哈希表節點都有一個next指針,多個哈希表節點能夠用next指針構成一個單向鏈表,被分配到同一個索引上的多個節點能夠用這個單向 
鏈表鏈接起來,如: 
鍵值對k2, v2與鍵值對k1, v1經過計算後的索引值都爲2,這時及產生衝突,可是能夠通道next指針將k2, k1所在的節點鏈接起來,這樣就解決了哈希的衝突問題 
這裏寫圖片描述
4, 創建公共溢出區: 
這種方法的基本思想是:將哈希表分爲基本表和溢出表兩部分,凡是和基本表發生衝突的元素,一概填入溢出表blog

相關文章
相關標籤/搜索