數據結構之散列表

散列函數:Hash(key)=Addr將查找表中的關鍵字映射成地址。
衝突:把兩個關鍵字或者兩個以上的關鍵字映射到同一個地址。
同義詞:不同的關鍵字映射在同一個地址,這幾個關鍵字稱之爲。
散列表:存儲關鍵字和存儲地址直接映射關係的表。

構造散列函數應該注意:
1,散列函數的定義域要包含全部要存儲的關鍵字。(不能有存不上的數據)。
2,散列函數等概率,均勻的分佈在整個地址空間。(也就是儘可能減少衝突)。
3,散列函數儘量簡單,能較短時間算出散列地址。
常見的散列函數
1, 直接定址法:H(Key)=a*key+b;
適用於:分佈基本連續
優點:計算簡單,不會產生衝突
缺點:如果分佈不連續,產生較多空位,造成存儲空間的浪費

例如:
我們的key是【1,2,3,4,5,6,7,8,9,10】
這個函數會使其均勻的分佈在內存地址裏。
例如:
我們的key是【1,3,5,7,9,11,13,15,17,19】
這個函數就會造成大量的存儲空間浪費。
2, 除留餘數法:H(key)=key%p;
特點:簡單,常用
p的選取:散列表長度爲m,取一個不大於m的最接近m的質數。
優點,等概率的映射到散列空間上的任意地址。從而儘可能減少衝突。
3, 數字分析法:
分析一組數據,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現衝突的機率就會很大。但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果用後面的數字來構成散列地址,則衝突的機率會明顯降低。
4, 平方取中法
取關鍵字的平方值的中間幾位,具體取幾位看實際情況。
優點:這樣得到的散列地址與關鍵字的每一位都有關係。
適用於:關鍵字的每一位取值都不均勻,或小於散列地址所需位數。
5, 摺疊法
將關鍵字分割爲位數相同的幾個部分。取這幾個部分的疊加和作爲散列地址。
處理衝突的方法:
1,開放定址法
可存放新表項的空閒地址,既向同義詞開放,又向非同義詞開放。
1)線性探索法
查看下一個單元,下一個單元滿了再查下下個單元,直到找到爲止。
2)平方探測法
di=1²,-1²,2²,-2².。。。。。。。k²,-k²,其中K<=m/2,m必須是一個可以表示成4k+3的質數,又稱二次探測法。
3)再散列法
通過第一個散列函數得到地址發生衝突時,利用第二個散列函數計算關鍵字地址增量。
4)僞隨機序列法
當di爲僞隨機序列時,稱爲僞隨機序列法。
2,拉鍊法
適用於經常插入,刪除。
拉鍊法如圖
在這裏插入圖片描述 散列表查找順序效率取決於:散列函數,處理衝突方法,填裝因子。 填裝因子α=n/m; n爲表中記錄數,m爲散列表長度。