1. 程式人生 > >開放定址法(線性探測),拉鍊法 -Hash演算法

開放定址法(線性探測),拉鍊法 -Hash演算法

總結:

雜湊別名為:Hash 或者 散列表;
開放定址法是為了解決hash值碰撞後的處理;

散列表(雜湊)是演算法在時間和空間上作出權衡的經典例子。

如果沒有記憶體限制,我們可以直接將鍵作為(可能是一個超大的)陣列的索引,那麼所有查詢操作只需要訪問記憶體一次即可完成。但這種情況不會經常出現,因此當鍵很多時需要的記憶體太大。
另一方面,如果沒有時間限制,我們可以使用無序陣列並進行順序查詢,這樣就只需要很少的記憶體。而散列表則使用了適度的空間和時間並在這兩個極端之間找到了一種平衡。

開放定址法

所謂開放定址法,即是由關鍵碼得到的雜湊地址一旦產生了衝突,也就是說,該地址已經存放了資料元素,就去尋找下一個空的雜湊地址,只要雜湊表足夠大,空的雜湊地址總能找到,並將資料元素存入。

線性探測法

Hi=(Hash(key)+di) mod m ( 1≤i < m )
其中:
Hash(key)為雜湊函式
m 為雜湊表長度
di 為增量序列1,2,……,m-1,且di=i
步驟:
而Hash(3)=3,雜湊地址上衝突,由
H1=(Hash(3)+1) mod 11=4 仍然衝突;
H2=(Hash(3)+2) mod 11=5 仍然衝突;
H3=(Hash(3)+3) mod 11=6 找到空的雜湊地址,存入。

原理:
這裡寫圖片描述

當碰撞發生時,我們直接檢查散列表中的下一個位置(將索引值加1),如果不同則繼續查詢,直到找到該鍵或遇到一個空元素。
注意:
Hash表的長要大於需要插入元素值,不然最後資料無法找到空元素。

二次探測法

Hi=(Hash(key)±di) mod m
其中:
Hash(key)為雜湊函式
m 為雜湊表長度,m 要求是某個4k+3 的質數(k 是整數)
di 為增量序列12,-12,22,-22,……,q2,-q2 且q≤1/2 (m-1)
步驟:
對關鍵碼尋找空的雜湊地址只有3 這個關鍵碼與上例不同,
Hash(3)=3,雜湊地址上衝突,由
H1=(Hash(3)+12) mod 11=4 仍然衝突;
H2=(Hash(3)-12) mod 11=2 找到空的雜湊地址,存入。

雙雜湊函式探測法

Hi=(Hash(key)+i*ReHash(key)) mod m (i=1,2,……,m-1)
其中:
Hash(key),ReHash(key)是兩個雜湊函式,
m 為雜湊表長度
步驟:
雙雜湊函式探測法,先用第一個函式Hash(key)對關鍵碼計算雜湊地址,一旦產生地址衝突,再用第二個函式ReHash(key)確定移動的步長因子,最後,通過步長因子序列由探測函式尋找空的雜湊地址。

比如,Hash(key)=a 時產生地址衝突,就計算ReHash(key)=b,則探測的地址序列為
H1=(a+b) mod m,H2=(a+2b) mod m,……,Hm-1=(a+(m-1)b) mod m

拉鍊法