1,直接尋址方法
以關鍵字或關鍵字的線性函數值作為哈希地址。即:H(key)=key或h (key) = akey+b .其中a和b為常數(這個哈希函數稱為自身函數)。
2.數字分析方法
假設關鍵詞是基於R的數(比如基於10的十進制數),哈希表中所有可能的關鍵詞都是預先知道的,那麽可以用關鍵詞的幾個數字組成壹個哈希地址。
3、廣場取法。
關鍵字平方後的中間數字是哈希地址。這是構造哈希函數的常用方法。通常在選擇哈希函數的時候,妳可能並不知道所有的關鍵詞,也不壹定合適選擇哪幾個,但是壹個數的平方的中間位數和這個數的每壹位都有關系。
4.折疊法
將關鍵字分成若幹個位數相同的部分(最後壹部分的位數可以不同),然後取這些部分的疊加和(四舍五入)作為哈希地址。這種方法叫做折疊。當關鍵字很多,並且每個關鍵字上的數字分布幾乎均勻時,可以通過折疊的方法得到哈希地址。
5,余者除外。
通過將關鍵字除以不大於哈希表長度m的數p得到的余數是哈希地址。即H(key) = key MOD p,pm。這是構造哈希函數最簡單也是最常用的方法。它不僅可以直接取關鍵詞的模(MOD),還可以取折疊和平方平均運算後的模。
6.隨機數方法
選擇壹個隨機函數,取關鍵字的隨機函數值作為其哈希地址,即H(key)=random(key),其中random為隨機函數。通常在關鍵字長度不等的情況下,用這種方法構造哈希函數比較合適。
沖突的處理:
在哈希表中,不同的鍵值對應相同的存儲位置。即關鍵字K1≠K2,但H (K1) = H (K2)。統壹的哈希函數可以減少沖突,但不能避免沖突。沖突發生後,必須解決;也就是說,我們必須找到下壹個可用地址並解決沖突:
1.鏈接法(zipper method):哈希地址相同的記錄存儲在壹個線性鏈表中。比如余數法,設鍵為(18,14,01,68,27,55,79),除數為13,哈希地址為(5,1,1)。
2.開放式尋址方式:如果h(k)已經被占用,按以下順序探測:(H (k)+P (1))% Tsize,(H (k)+P (2))% Tsize,?,(h(k)+p(i))%TSize,?其中h(k)是哈希函數,TSize是哈希表長度,p(i)是探測函數。
在h (k)+p(i-1))% tsize的基礎上,如果發現沖突,增量p(i)用於新的檢測,直到沒有沖突出現。
根據探測函數p(i)的不同,開放式尋址方法可分為線性探測法(p(i) = i: 1,2,3,?),二次勘探法(p(I)=(-1)(I-1)*((I+1)/2)2,勘探順序為:1,-1,4。)。
隨機探測法(p(i):隨機數),雙哈希函數法(雙哈希函數h(key),hp (key)如果h(key)沖突,用hp (key)查找哈希地址。勘探順序是:h(k),h(k)+ hp(k),?,h(k)+ i*hp(k))。
3.桶尋址法:桶是壹個足夠大的存儲空間。桶尋址將桶與表中的每個地址相關聯。如果桶滿了,可以用開放式尋址的方法來處理。比如插入A5,A2,A3,B5,A9,B2,B9,C2,通過線性探索解決沖突。