散列查找(HashSearch)


散列查找法(HashSearch)

  • 散列查找法(HashSearch)的思想,它通過對元素的關鍵字值進行某種運算,直接求出元素的地址,即使用關鍵字到地址的直接轉換方法,而不需要反復比較。因此,散列查找法又叫雜湊法或散列法。
  • 散列(Hashing)通過散列函數將要檢索的項與索引(散列,散列值)關聯起來,生成一種便於搜索的數據結構(散列表)。
  • 散列的概念屬於查找,采用直接尋址技術。在理想情況下,查找的期望時間為O(1)。
  • 散列函數和散列地址:在記錄的存儲位置p和其關鍵字key之間建立一個確定的對應關系H, 使 p=H(key), 稱這個對應關系H為散列函數,p為散列地址。
  • 散列表:一個有限連續的地址空間,用以存儲按散列函數計算得到相應散列地址的數據記錄。通常散列表的存儲空間是一個一維數組,散列地址是數組的下標。
  • 沖突和同義詞:對不同的關鍵字可能得到同一散列地址,即key!=key2 ,而H(key1)=H(key2),這種現象稱為沖突。具有相同函數值的關鍵字對該散列函數來說稱作同義詞,key1, 與key2互稱為同義詞。

hash函數

hash函數就是把任意長的輸入字符串變化成固定長的輸出字符串的一種函數。

輸出字符串的長度稱為hash函數的位數。

哈希函數構造考慮

  1. 散列表的長度;關鍵字的長度;關鍵字的分布情況;
  2. 散列函數的計算簡單,快速;
  3. 散列函數能將關鍵字集合K均勻地分布在地址集{0,1,…,m-1}上,使沖突最小。

哈希函數的構造方法

1. 直接定址法

取關鍵字或關鍵字的某個線性函數值為哈希地址:H(key) = key 或 H(key) = a*key + b
其中a和b為常數,這種哈希函數叫做自身函數。

注意:由於直接定址所得地址集合和關鍵字集合的大小相同。因此,對於不同的關鍵字不會發生沖突。但實際中能使用這種哈希函數的情況很少

2. 相乘取整法

首先用關鍵字key乘上某個常數A(0 < A < 1),並抽取出key*A的小數部分;然后用m乘以該小數后取整。

注意:該方法最大的優點是m的選取比除余法要求更低。比如,完全可選擇它是2的整數次冪。雖然該方法對任何A的值都適用,但對某些值效果會更好。Knuth建議選取 0.61803……。

3. 平方取中法

取關鍵字平方后的中間幾位為哈希地址。通過平方擴大差別,另外中間幾位與乘數的每一位相關,由此產生的散列地址較為均勻。這是一種較常用的構造哈希函數的方法。

4. 除留余數法

取關鍵字被數p除后所得余數為哈希地址:H(key) = key mod p (p ≤ m)。

注意:這是一種最簡單,也最常用的構造哈希函數的方法。它不僅可以對關鍵字直接取模(MOD),也可在折迭、平方取中等運算之后取模。值得注意的是,在使用除留余數法時,對p的選擇很重要。一般情況下可以選p為小於表長的最大質數。

5. 隨機數法

選擇一個隨機函數,取關鍵字的隨機函數值為它的哈希地址,即 H(key) = random (key);

通常,當關鍵字長度不等時采用此法構造哈希函數較恰當。

實際應用的哈希函數

目前應用最為廣泛的hash函數是SHA-1和MD5算法,大多是128位和更長。

哈希沖突

哈希一定會存在沖突,所以需要解決沖突的辦法。

1. 開放地址法

地址H0=H(key)發生沖突時,以H0為基礎 ,采取合適方法計算得到另一個地址H1, 如果H1仍然發生沖突,以H1為基礎再求下一個地址H2,若H2仍然沖突,再求得H3。依次類推,直至Hk不發生沖突為止,則Hk為該記錄在表中的散列地址。

這種方法在尋找"下一個"空的散列地址時,原來的數組空間對所有的元素都是開放的,所以稱為開放地址法。通常把尋找"下一個"空位的過程稱為探測。上述方法可用如下公式表示:
Hi = (H(key) +di) % m ; i= 1, 2, …,k(k<=m-1)
其中H(key)稱為散列函數,m為表長,di為增量序列;
增量 d 可以有不同的取法,並根據其取法有不同的稱呼:
( 1 ) d i = 1 , 2 , 3 , …… 線性探測;
( 2 ) d i = 1^2 ,- 1^2 , 2^2 ,- 2^2 , k^2, -k^2…… 二次探測;
( 3 ) d i = 偽隨機數 偽隨機探測;
當表中 i, i+ 1, i+2 位置上已填有記錄時,下一個散列地址為i、i+1 、i+2 和i+3 的記錄都將填入i+3 的位置,這種在處理沖突過程中發生的兩個第一個散列地址不同的記錄爭奪同一個后繼散列地址的現象稱作"二次聚集"或稱作"堆積",即在處理同義詞的沖突過程中又添加了非同義詞的沖突。

  • 線性探測法的優點是:只要散列表未填滿,總能找到一個不發生沖突的地址。缺點是:會產生"二次聚集"現象。
  • 二次探測法和偽隨機探測法的優點是:可以避免"二次聚集"現象。缺點也很顯然:不能保證一定找到不發生沖突的地址。

2. 鏈地址法

鏈地址法的基本思想是:把具有相同散列地址的記錄放在同一個單鏈表中,稱為同義詞鏈表。有 m 個散列地址就有 m 個單鏈表,同時用數組HT[0…m-1]存放各個鏈表的頭指針,凡是散列地址為i的記錄都以結點方式插入到以 HT[i]為頭結點的單鏈表中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM