雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時。衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位。因此,處理衝突和溢位是 雜湊技術中的兩個重要問題。
1, 開放定址法:
所謂的開放定址法就是一旦發生了衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能找到,並將記錄存入
公式為:fi(key) = (f(key)+di) mod m (di=1,2,3,……,m-1)
※ 用開放定址法解決衝突的做法是:當衝突發生時,使用某種探測技術在雜湊表中形成乙個探測序列。沿此序列逐個單元地查詢,直到找到給定的關鍵字,或者
碰到乙個開放的位址(即該位址單元為空)為止(若要插入,在探查到開放的位址,則可將待插入的新結點存人該位址單元)。查詢時探測到開放的位址則表明表
中無待查的關鍵字,即查詢失敗。
比如說,我們的關鍵字集合為,表長為12。 我們用雜湊函式f(key) = key mod l2
當計算前s個數時,都是沒有衝突的雜湊位址,直接存入:
計算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, 建立公共溢位區:
這種方法的基本思想是:將雜湊表分為基本表和溢位錶兩部分,凡是和基本表發生衝突的元素,一律填入溢位表
解決hash衝突
開放位址法 1.線性探測法 線性再雜湊法是形式最簡單的處理衝突的方法。插入元素時,如果發生衝突,演算法會簡單的 從該槽位置向後迴圈遍歷hash表,直到找到表中的下乙個空槽,並將該元素放入該槽中 會導致相同hash值的元素挨在一起和其他hash值對應的槽被占用 查詢元素時,首先雜湊值所指向的槽,如果沒...
hash衝突解決
雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時 衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位 因此,處理衝突和溢位是 雜湊技術中...
Hash衝突解決
hash衝突 解決方法 再雜湊法 鏈位址法 建立公共溢位區 開放定址法也稱再雜湊,假設容量為c,當前hash值為d,則 線性探測再雜湊 依次探測d 1,d 2 c 1,0,1,2,d 1 平方探測再雜湊 依次探測d 12,d 12,d 22,d 22 偽隨機探測再雜湊 隨機序列3,2,5 依次d 3...