[C++]資料結構:散列表(雜湊表)、雜湊函式構造、處理雜湊衝突
阿新 • • 發佈:2019-02-14
關鍵字{12,25, 38, 15, 16, 29, 78, 67, 56, 21, 22, 47 } , 對應後位置是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}。
不過這種方法很容易產生衝突(如果關鍵字餘數大部分相同)。一般地,散列表長為m, 通常p 為小於或等於表長(最好接近m)的最小質數或不包含小於20質因子的合
數。
4. 其他方法
還有很多其他構造方法,比如平方取中法,摺疊法,隨機數法等。我們也可以自己構造雜湊函式F,只要能很好的滿足構造原則。
三、處理雜湊衝突的方法
雜湊衝突:理想情況下,每一個關鍵字,通過雜湊函式對映,得到的地址都是唯一的。現實中,常會碰到 key1 != key2 , 但是F (key1) = F ( key2),把這種現象稱為衝突,並把這兩個關鍵字稱為這個雜湊函式的同義詞。
雜湊衝突的出現,將會造成查詢錯誤,我們要想辦法解決衝突。
1. 開放定址法
一旦發生了衝突,就去尋找下一個空的雜湊地址,只要散列表足夠大,空的雜湊地址總能找到。
計算公式如下:
F_i (key)=(F(key)+d_i ) mod m (d_i=1,2,3,…,m-1)
舉個例子,關鍵字集合{12,67,56,16,25,37,22,29,15,47,48,34} ,表長12。 f (key) = key mod 12.
計算前五個數{12,67,56,16,25},無衝突,直接存入,得表1:
計算key = 37, f (37) = 1, 與 25所在位置衝突,應用 f (37) = ( f (37) +1 ) mod 12 = 2 , 將37存在下標為 2 的位置,得到表2:
接下來存{22,29,15,47} 都沒有衝突,正常存入,得表3: