Hash演算法解決雜湊衝突的四種方法

2021-10-06 11:53:48 字數 1358 閱讀 6496

目錄

定址方法:

1、線性探測

2、二次探測

3、雙重雜湊

裝載因子

二、鍊錶法

潛在的問題:

三、建立公共溢位區:

某個資料經過雜湊函式雜湊之後,儲存位置已經被占用了,我們就從當前位置開始,依次往後查詢,看是否有空閒位置,直到找到為止。

元素的查詢:通過雜湊函式求出要查詢元素的鍵值對應的雜湊值,然後比較陣列中下標為雜湊值的元素和要查詢的元素。如果相等,則說明就是我們要找的元素;否則就順序往後依次查詢。如果遍歷到陣列中的空閒位置,還沒有找到,就說明要查詢的元素並沒有在雜湊表中。

元素的刪除:通過線性探測方法,找到乙個空閒位置,就可以認定雜湊表中不存在這個資料。但是,如果這個空閒位置是我們後來刪除的,就會導致原來的查詢演算法失效。本來存在的資料,會被認定為不存在。這個問題如何解決呢?我們可以將刪除的元素,特殊標記為 deleted。當線性探測查詢的時候,遇到標記為 deleted 的空間,並不是停下來,而是繼續往下探測。

存在的問題:當雜湊表中插入的資料越來越多時,雜湊衝突發生的可能性就會越來越大,空閒位置會越來越少,線性探測的時間就會越來越久。極端情況下,我們可能需要探測整個雜湊表,所以最壞情況下的時間複雜度為 o(n)。同理,在刪除和查詢時,也有可能會線性探測整張雜湊表,才能找到要查詢或者刪除的資料。

二次探測 探測的步長就變成了原來的「二次方」,下標序列就是 hash(key)+0,hash(key)+1^2,hash(key)+2^2

就是不僅要使用乙個雜湊函式。我們使用一組雜湊函式 hash1(key),hash2(key),hash3(key)……我們先用第乙個雜湊函式,如果計算得到的儲存位置已經被占用,再用第二個雜湊函式,依次類推,直到找到空閒的儲存位置;

不管採用哪種探測方法,當雜湊表中空閒位置不多的時候,雜湊衝突的概率就會大大提高。

裝載因子(填入表中的元素個數/雜湊表的長度)來表示空位的多少。裝載因子越大,說明空閒位置越少,衝突越多,雜湊表的效能會下降。

存在多hashmap使用的處理hash衝突的方式,鍊錶的形式,在同乙個位置存放多個元素。

惡意的攻擊者,可能通過精心構造的資料,所有的資料經過雜湊函式之後,都雜湊到同乙個槽裡。基於鍊錶的衝突解決方法,在這個時候,雜湊表就會退化為鍊錶,查詢的時間複雜度就從 o(1) 急劇退化為 o(n)。

基本思想是:將雜湊表分為基本表和溢位錶兩部分,凡是和基本表發生衝突的元素,一律填入溢位表

資料結構和演算法之美 - 18

解決hash衝突的四種辦法

目錄 開放定址法 線性探測再雜湊 二次探測再雜湊 偽隨機探測再雜湊 再雜湊法 鏈位址法 建立公共溢位區 優缺點 開放雜湊 open hashing 拉鍊法 針對桶鏈結構 封閉雜湊 closed hashing 開放定址法 通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝...

解決雜湊衝突的四種辦法

雜湊是通過對資料進行再壓縮,提高效率的一種解決方法。但由於通過雜湊函式產生的雜湊值是有限的,而資料可能比較多,導致經過雜湊函式處理後仍然有不同的資料對應相同的雜湊值。這時候就產生了雜湊衝突。裝填因子 裝填因子 資料總數 雜湊表長 雜湊函式 處理衝突的方法 解決雜湊衝突的四種方法 1 線性探測 按順序...

解決hash衝突的四種方法

通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另乙個關鍵問題。建立雜湊表和查詢雜湊表都會遇到衝突,兩種情況下解決衝突的方法應該一致。下面以建立雜湊表為例,說明解決衝突的方法。常用的解決衝突方法有以下四種 這種方法也稱再雜湊法,其基本思想是 當關鍵字key的...