資料結構,資料結構與演算法

來源:互聯網
上載者:User

資料結構,資料結構與演算法
雜湊尋找

之前的尋找演算法,時間複雜度為O(n),或者O(㏒2n),其效率取決於“比較”的次數。

   即使對於採取排序樹結構的尋找表,由於每一次比較的結果,如果關鍵字與資料元素不相等,則有“大於”或者“小於”兩個結果,所以下一步會有兩種可能的方向,因此O(㏒2n)已經是最優了。

雜湊表(Hash Table)採取另一種演算法,其尋找的時間複雜度最快可以達到O(1),即只要給出關鍵字,立刻就可以尋找到該元素。

實際應用中大量採取雜湊表的方式,很多程式設計語言中內建了雜湊尋找的方式,如java中的HashTable,HashSet等。

基本思想
將記錄的儲存地址和它的關鍵字之間建立一個確定的對應關係;這樣,不經過比較,一次存取就能得到所查元素的尋找方法。

  1. 雜湊函數(Hash函數) f : 關鍵字 → 儲存位置。即,hash函數是指關鍵字與儲存位置(雜湊地址)的對應關係,只要給出關鍵字,就可以通過這個函數得到儲存位置。

如:給定一個儲存了10個元素的數組
[ 0 1 2 3 4 5 6 7 8 9 ]

如果給定Hash函數f(K)=K mod 10,就可以立刻得到該索引值對應元素的數組下標如果給定Hash函數f(K)=K mod 2,則雖然也縮小了尋找範圍,但達不到上面函數的效果
雜湊函數的衝突
如果不同的索引值,被Hash函數映射到同樣的一個雜湊地址,則稱為衝突(kikj,H(ki)=H(kj))同義字:具有相同函數值的兩個不同的關鍵字,稱為該雜湊函數的同義字。   Hash函數不可能完全避免衝突,只可能盡量減少衝突,或者說,好的Hash函數能將關鍵字映射後得到的雜湊地址,盡量均勻地分布設計Hash表的時候,除了採用好的Hash函數之外,如何有效地處理衝突,也是很重要的一方面

雜湊表:

 根據設定的雜湊函數H(key)和處理衝突的方法,將一組關鍵字映射到一個有限的連續的地址區間上,並以關鍵字的映像作為記錄在表中的儲存位置。映射過程稱為雜湊造表,或者散列(雜湊表有時也叫散列表)所得的儲存位置值稱為雜湊地址或者散列地址
雜湊函數的構造
   雜湊函數是一種映象,其設定很靈活,只要使任何關鍵字的雜湊函數值都落在表長允許的範圍之內即可。雜湊函數“好壞”的主要評價因素有:

◆ 散列函數的構造簡單;
◆ 關鍵字經雜湊函數映射後,得到的地址是等機率的,即“均勻”的,這樣的Hash函數稱為“均勻的雜湊函數”

好的Hash函數,可以減少關鍵字的衝突。
直接定址法:取關鍵字或者關鍵字的某個線性函數作為Hash地址,即:    H(key) = key    H(key) = a×key + b,a、b為常數特點:直接定址法所得地址集合與關鍵字集合大小相等,不會發生衝突,但實際中很少使用,因為需事Crowdsourced Security Testing道關鍵字的分布情況。數字分析法:取關鍵字的若干位或組合作為雜湊地址平方取中法:將關鍵字平方後取中間幾位作為雜湊地址摺疊法:將關鍵字分割成位元相同的幾部分(最後一部分可以不同),然後取這幾部分的疊加和作為雜湊地址除留餘數法(模數)    把關鍵字對某個數p(不大於雜湊表的表長m)模數,所得到的數作為雜湊地址     H(key) = key MOD p, p≤m    利用這種方法的關鍵是p的選取,p選的不好,容易產生同義字。     根據經驗:若散列表表長為m,通常p為小於或等於表長(最好接近表長m)的 質數;或不包含小於20質因子的合數(如:23*29)。隨機數法    H(key) = random(key),把產生的隨機數做為雜湊地址。     當散列表中關鍵字長度不等時,該方法比較合適。

總結:根據具體問題,採取不同的雜湊函數,依據以下:
雜湊Function Compute時間
關鍵字長度
雜湊表大小(雜湊位址範圍)
關鍵字分布情況
記錄尋找頻率

衝突處理的方法

衝突:由關鍵字得到的雜湊地址的位置上已經有記錄

雜湊函數只能使雜湊地址均勻分布,但不能避免衝突,因此衝突處理是不可避免的

處理衝突的基本思想:在處理的過程中,可能會得到一個地址序列Hi,i = 1,2,…,k,即每次得到一個雜湊地址Hi,若仍然發生了衝突,則再由相應方法得到下一個雜湊地址Hi+1,直到得到一個不發生衝突的雜湊地址為止

衝突處理即找到這個相應方法,即當出現衝突時,為衝突元素找到另一個儲存位置。

開放地址法
處理衝突函數為
Hi = (H(key) + di) MOD m,
i = 1,2, …,k, k ≤ m-1
Hi為雜湊函數,m為雜湊表的表長,di為增量序列
di的選取方法
di=1,2,3, …,m-1,稱為“線性探測再散列”
di=12,-12,22,-22, …,k2,-k2, k≤m/2,稱為“二次探測再散列”
di為偽隨機數序列,稱為“偽隨機探測再散列”

再雜湊法
    構造若干個雜湊函數,當發生衝突時,利用不同的雜湊函數再計算下一個新雜湊地址,直到不發生衝突為止。即:Hi=RHi(key)     i=1, 2, …, k    RHi :一組不同的雜湊函數。第一次發生衝突時,用RH1計算,第二次發生衝突時,用RH2計算…依此類推知道得到某個Hi不再衝突為止。

◆ 優點:不易產生衝突的“聚集”現象;
◆ 缺點:計算時間增加。

鏈地址法

方法:將所有關鍵字為同義字(散列地址相同)的記錄儲存在一個單鏈表中,並用一維數組存放鏈表的頭指標。
設散列表長為m,定義一個一維指標數組:
RecNode *linkhash[m],
其中RecNode是結點類型,每個分量的初值為空白。
凡散列地址為k的記錄都插入到以linkhash[k]為頭指標的鏈表中。

雜湊表的尋找過程與構造過程基本一致,在尋找過程中,利用雜湊函數和衝突函數,直到尋找失敗或者尋找成功。

雜湊尋找分析

從雜湊尋找過程可見:
散列表在關鍵字與記錄的儲存地址之間建立了直接映象;
由於“衝突”,雜湊表也存在著關鍵字的比較,其效能瓶頸取決於比較的次數
評價雜湊尋找效率仍要用ASL(平均尋找長度)

雜湊函數
雜湊函數的好壞,影響出現衝突的頻繁程度。一個均勻的雜湊函數,對一組關鍵字,產生的衝突可能性都相同,它不是影響ASL的決定性因素
衝突處理方法
針對所介紹的幾個衝突處理方法(線性探測、二次探測、隨機探測、再探測、鏈地址),各自的ASL不同
裝填因子(衡量雜湊表的裝滿程度)影響該雜湊表的ASL
= 表中記錄數/雜湊表長度

裝填因子越小,發生衝突的可能性就越小,反之就越大(需比較的次數就越多)
結論:雜湊表的平均尋找長度(ASL)跟裝填因子有關,而跟記錄數無關

雜湊函數與衝突處理函數的設計,是雜湊表設計的兩個核心問題,如果設計得當,雜湊表由於其他尋找表,這也是它被廣泛使用的原因

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.