Hash函式和Hash衝突

2021-10-05 06:20:35 字數 1268 閱讀 2673

2.rehash

3.鍊錶法

4.建立公共溢位區

一、簡介

將任意長度的數值以某個對映規則對映為固定長度的數值,這個過程稱為hash,而這個對映規則被稱為hash函式,而對這個key、value進行儲存的資料結構被稱為hash表。

由於通過key的hash對映直接得到了記憶體位址,所以hash查詢的時間複雜度是o(1),但也因此開闢了hash表的記憶體空間,屬於用空間換取時間的典型例子。

如果不同的key經過hash函式的對映到了同乙個位置,這個情況就是hash衝突了,雖然有了衝突就要解決,但是選取乙個好的hash函式,使得對映的位置分布均勻也是很重要的。

二、解決hash衝突

舉例:arr=[4,6,9,14]

hash函式(一般為取模函式,模選取某個質數) h = n%5

很明顯4與9,14衝突了。

1.開放定址法

這個位址衝突了,給它換個位址。

①線性探測再雜湊

這個位置衝突了,直接向後挪動一位,如果後面一位也衝突了,繼續向後挪動。

②二次探測再雜湊

這個位置衝突了,第一次向後挪動一位,第二次挪動4位,第三次挪動9位,第n次移動第n^2位。

③偽隨機數再雜湊

這個位置衝突了,每次移動的數是個隨機數。

2.rehash

構造多個hash函式,對於第一次hash衝突的值再進行hash計算。

還是上面的例子,對於衝突的4,9,14還可以構造乙個hash函式 h1=n%7

3.鍊錶法

即衝突的元素不再往左右挪動了,而是以鍊錶的形式存在。(hashmap就是採用這種方式,具體方式以後再寫部落格記錄)

4.建立公共溢位區

即將hash表拆分為兩個表,基本表和溢位表,溢位的值全部放在溢位表中

Hash表和Hash衝突

hash表中的元素儲存位址是通過hash函式計算出來的,當要取出指定元素的時候,直接通過hash函式計算出元素的儲存位址。有時候會出現key不同,但是通過hash函式計算出來的值相同,這個值相同意味著這兩個key要存在同一位置,這顯然不對,這就是hash衝突。hash函式有多種構造方法,常見的有直接...

hash,解決hash衝突的方法

數字分析法 平方取中法 除留餘數法 偽隨機數法 線性探測 二次探測 偽隨機數探測 拉鍊探測。如果負載因子是預設的0.75,hashmap 16 的時候,佔16個記憶體空間,實際上只用到了12個,超過12個就擴容。如果負載因子是1的話,hashmap 16 的時候,佔16個記憶體空間,實際上會填滿16...

hash衝突處理

1 衝突是如何產生的?上文中談到,雜湊函式是指如何對關鍵字進行編址的規則,這裡的關鍵字的範圍很廣,可視為無限集,如何保證無限集的原資料在編址的時候不會出現重複呢?規則本身無法實現這個目的。舉乙個例子,仍然用班級同學做比喻,現有如下同學資料 張三,李四,王五,趙剛,吳露.假如我們編址規則為取姓氏中姓的...