1. 程式人生 > >[C++]資料結構:散列表(雜湊表)、雜湊函式構造、處理雜湊衝突

[C++]資料結構:散列表(雜湊表)、雜湊函式構造、處理雜湊衝突

        關鍵字{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: