怎麼解決 hash 衝突

2022-09-01 07:45:06 字數 1027 閱讀 4411

開放定址法:

線性探測再雜湊

二次探測再雜湊

偽隨機

再hash:

同時構造,多個不同的hash函式

鍊錶,

建立公共溢位區:

分為基本表和溢位表兩個部分

1)優點:

①對於記錄總數頻繁可變的情況,處理的比較好(也就是避免了動態調整的開銷)

②由於記錄儲存在結點中,而結點是動態分配,不會造成記憶體的浪費,所以尤其適合那種記錄本身尺寸(size)很大的情況,因為此時指標的開銷可以忽略不計了

③刪除記錄時,比較方便,直接通過指標操作即可

2)缺點: 

①儲存的記錄是隨機分布在記憶體中的,這樣在查詢記錄時,相比結構緊湊的資料型別(比如陣列),雜湊表的跳轉訪問會帶來額外的時間開銷

②如果所有的 key-value 對是可以提前預知,並之後不會發生變化時(即不允許插入和刪除),可以人為建立乙個不會產生衝突的完美雜湊函式(perfect hash function),此時封閉雜湊的效能將遠高於開放雜湊

③由於使用指標,記錄不容易進行序列化(serialize)操作

1)優點: ①記錄更容易進行序列化(serialize)操作 

②如果記錄總數可以預知,可以建立完美雜湊函式,此時處理資料的效率是非常高的

2)缺點:

①儲存記錄的數目不能超過桶陣列的長度,如果超過就需要擴容,而擴容會導致某次操作的時間成本飆公升,這在實時或者互動式應用中可能會是乙個嚴重的缺陷

②使用探測序列,有可能其計算的時間成本過高,導致雜湊表的處理效能降低

③由於記錄是存放在桶陣列中的,而桶陣列必然存在空槽,所以當記錄本身尺寸(size)很大並且記錄總數規模很大時,空槽占用的空間會導致明顯的記憶體浪費 

④刪除記錄時,比較麻煩。

比如需要刪除記錄a,記錄b是在a之後插入桶陣列的,但是和記錄a有衝突,是通過探測序列再次跳轉找到的位址,所以如果直接刪除a,a的位置變為空槽,而空槽是查詢記錄失敗的終止條件,這樣會導致記錄b在a的位置重新插入資料前不可見,所以不能直接刪除a,而是設定刪除標記。這就需要額外的空間和操作。

解決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...