雜湊衝突處理 開放定址法

2021-09-25 23:56:36 字數 1360 閱讀 2468

設計得再好的雜湊函式也不可能完全避免衝突,這就像我們再健康也只能盡量預防疾病,但卻無法保證永遠不得病一樣,既然衝突不能避免,就要考慮如何處理它。

那麼當我們在使用雜湊函式後發現兩個關鍵字key1≠key2,但是卻有f(key1) = f(key2),即有衝突時,怎麼辦呢?我們可以從生活中找尋思路。

試想一下,當你觀望很久很久,終於看上一套房打算要買了,正準備下訂金,人家告訴你,這房子已經被人買走了,你怎麼辦?對呀,再找別的房子唄!這其實就是一種處理衝突的方法開放定址法。

公式為:

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的位置。這其實就是房子被人買了於是買下一間的

作法:

接下來22,29,15,47都沒有衝突,正常的存入:

到了 key=48,我們計算得到f(48) = 0,與12所在的0位置衝突了,不要緊,我們f(48) = (f(48)+1) mod 12 = 1,此時又與25所在的位置衝突。於是f(48) = (f(48)+2) mod 12=2,還是衝突……一直到 f(48) = (f(48)+6) mod 12 = 6時,才有空位,機不可失,趕快存入:

我們把這種解決衝突的開放定址法稱為線性探測法。

從這個例子我們也看到,我們在解決衝突的時候,還會碰到如48和37這種本來都不是同義詞卻需要爭奪乙個位址的情況,我們稱這種現象為堆積。很顯然,堆積的出現,使得我們需要不斷處理衝突,無論是存入還是查詢效率都會大大降低。

雜湊表(開放定址法處理衝突)

題目 雜湊表 開放定址法處理衝突 雜湊表的基本思路是,設要儲存的元素個數為n,設定乙個長度為m m n 的陣列,每個元素ki的下標為對應函式f ki 這樣在查詢ki的時候就可以通過下標f ki 查詢 在建立雜湊表的時候會有所衝突,即ki和kj的函式值可能一樣,因此有處理衝突的方式 線性探測法 當產生...

雜湊 開放定址法

引起雜湊衝突的乙個原因可能是 雜湊函式設計不夠合理。雜湊函式設計原則 雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有m個位址時,其值域必須在0到m 1之間 雜湊函式計算出來的位址能均勻分布在整個空間中 雜湊函式應該比較簡單 閉雜湊typedef int keytype typede...

開放定址法解決衝突的雜湊表

題目描述 找是否有兩片完全相同的雪花,雪花總數為 0 n 100000,判斷兩片雪花是否相同的標準為其中一片雪花的的六角陣列經過向左 右 迴圈移位後與另一片的六角陣列相同 pragma warning disable 4786 include include includeusing namespa...