課程:《程序設計與數據結構》
班級: 1723
姓名: 餘坤澎
學號:20172313
實驗教師:王志強
實驗日期:2018年10月19日
必修/選修: 必修數組
哈希函數大致有六種構造方法:數據結構
1,直接定址法:
函數公式:f(key)=a*key+b (a,b爲常數)
這種方法的優勢是:簡單,均勻,不會產生衝突。可是須要事先知道關鍵字的分佈狀況,適合查找表較小而且連續的狀況。
2,數字分析法:
好比咱們的11位手機號碼「136XXXX7887」,其中前三位是接入號,通常對應不一樣運營公司的子品牌,如130是聯通如意通,136是移動神州行,153是電信等。中間四們是HLR識別號,表示用戶歸屬地。最後四們纔是真正的用戶號。
若咱們如今要存儲某家公司員工登記表,若是用手機號碼做爲關鍵字,那麼極有可能前7位都是相同的,因此咱們選擇後面的四們做爲哈希地址就是不錯的選擇。
3,平方取中法:
故名思義,好比關鍵字是1234,那麼它的平方就是1522756,再抽取中間的3位就是227做爲哈希地址。
4,摺疊法:
摺疊法是將關鍵字從左到右分割成位數相等的幾個部分(最後一部分位數不夠能夠短些),而後將這幾部分疊加求和,並按哈希表表長,取後幾位做爲哈希地址。
好比咱們的關鍵字是9876543210,哈希表表長三位,咱們將它分爲四組,987|654|321|0 ,而後將它們疊加求和987+654+321+0=1962,再求後3位即獲得哈希地址爲962,哈哈,是否是頗有意思。
5,除留餘數法:
函數公式:f(key)=key mod p (p<=m)m爲哈希表表長。
這種方法是最經常使用的哈希函數構造方法。
6,隨機數法:
函數公式:f(key)= random(key)。
這裏random是隨機函數,當關鍵字的長度不等是,採用這種方法比較合適。dom
開放定值法:這種方法也稱再散列法,其基本思想是:當關鍵字key的哈希地址p=H(key)出現衝突時,以p爲基礎,產生另外一個哈希地址p1,若是p1仍然衝突,再以p爲基礎,產生另外一個哈希地址p2,…,直到找出一個不衝突的哈希地址pi ,將相應元素存入其中。這種方法有一個通用的再散列函數形式:
Hi=(H(key)+di)% m i=1,2,…,n
其中H(key)爲哈希函數,m 爲表長,di稱爲增量序列。增量序列的取值方式不一樣,相應的再散列方式也不一樣。主要有如下三種:函數
線性探測再散列
dii=1,2,3,…,m-1
這種方法的特色是:衝突發生時,順序查看錶中下一單元,直到找出一個空單元或查遍全表。
二次探測再散列
di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 )
這種方法的特色是:衝突發生時,在表的左右進行跳躍式探測,比較靈活。
僞隨機探測再散列
di=僞隨機數序列。
具體實現時,應創建一個僞隨機數發生器,(如i=(i+p) % m),並給定一個隨機數作起點。
例如,已知哈希表長度m=11,哈希函數爲:H(key)= key % 11,則H(47)=3,H(26)=4,H(60)=5,假設下一個關鍵字爲69,則H(69)=3,與47衝突。
若是用線性探測再散列處理衝突,下一個哈希地址爲H1=(3 + 1)% 11 = 4,仍然衝突,再找下一個哈希地址爲H2=(3 + 2)% 11 = 5,仍是衝突,繼續找下一個哈希地址爲H3=(3 + 3)% 11 = 6,此時再也不衝突,將69填入5號單元。
若是用二次探測再散列處理衝突,下一個哈希地址爲H1=(3 + 12)% 11 = 4,仍然衝突,再找下一個哈希地址爲H2=(3 - 12)% 11 = 2,此時再也不衝突,將69填入2號單元。
若是用僞隨機探測再散列處理衝突,且僞隨機數序列爲:2,5,9,……..,則下一個哈希地址爲H1=(3 + 2)% 11 = 5,仍然衝突,再找下一個哈希地址爲H2=(3 + 5)% 11 = 8,此時再也不衝突,將69填入8號單元。性能
畫出順序查找的順序表和成功平均查找長度。
學習
畫出折半查找的順序表和成功平均查找長度。
測試
用線性探查法實現散列查找。
設計
用鏈地址法實現散列查找。
3d
前幾周的內容相對來講比較簡單,因此學習的時候有些放鬆,此次測試也讓我明白本身不會的東西還有不少,因此不能懈怠,還要繼續努力纔是,但願本身能在之後的學習生活中能繼續進步!指針