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