Hash算法解決沖突的方法一般有以下幾種常用的解決方法
1, 開(kāi)放定址法:
所謂的開(kāi)放定址法就是一旦發(fā)生了沖突,就去尋找下一個(gè)空的散列地址,只要散列表足夠大,空的散列地址總能找到,并將記錄存入
公式為:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1)
※ 用開(kāi)放定址法解決沖突的做法是:當沖突發(fā)生時(shí),使用某種探測技術(shù)在散列表中形成一個(gè)探測序列。沿此序列逐個(gè)單元地查找,直到找到給定的關(guān)鍵字,或者
碰到一個(gè)開(kāi)放的地址(即該地址單元為空)為止(若要插入,在探查到開(kāi)放的地址,則可將待插入的新結點(diǎn)存人該地址單元)。查找時(shí)探測到開(kāi)放的地址則表明表
中無(wú)待查的關(guān)鍵字,即查找失敗。
比如說(shuō),我們的關(guān)鍵字集合為{12,67,56,16,25,37,22,29,15,47,48,34},表長(cháng)為12。 我們用散列函數f(key) = key mod l2
當計算前S個(gè)數{12,67,56,16,25}時(shí),都是沒(méi)有沖突的散列地址,直接存入:
2, 再哈希法:
再哈希法又叫雙哈希法,有多個(gè)不同的Hash函數,當發(fā)生沖突時(shí),使用第二個(gè),第三個(gè),….,等哈希函數
計算地址,直到無(wú)沖突。雖然不易發(fā)生聚集,但是增加了計算時(shí)間。
3, 鏈地址法:
鏈地址法的基本思想是:每個(gè)哈希表節點(diǎn)都有一個(gè)next指針,多個(gè)哈希表節點(diǎn)可以用next指針構成一個(gè)單向鏈表,被分配到同一個(gè)索引上的多個(gè)節點(diǎn)可以用這個(gè)單向
鏈表連接起來(lái),如:
鍵值對k2, v2與鍵值對k1, v1通過(guò)計算后的索引值都為2,這時(shí)及產(chǎn)生沖突,但是可以通道next指針將k2, k1所在的節點(diǎn)連接起來(lái),這樣就解決了哈希的沖突問(wèn)題
聯(lián)系客服