雜湊表的具體實現就不多做介紹了,就是乙個陣列,每個下標儲存的是碰撞的元素的煉表頭指標,如下圖所示::
給定乙個能存放n個元素的、具有m個槽位的雜湊表t,定義t的裝載因子α為n/m,即乙個鏈中平均儲存的元素數。
用鏈結法雜湊的最壞情況效能很差:所有的n個關鍵字都雜湊到同乙個槽中,從而產生出乙個長度為n的鍊錶。這時,最壞情況下查詢的時間為o(n),再加上計算雜湊函式的時間,這麼一來就和用乙個鍊錶來鏈結所有的元素差不多了。顯然我們並不是因為雜湊表的最壞情況效能差才用它的。
雜湊方法的平均性態依賴於所選取的雜湊函式h在一般情況下,將所有的關鍵字分布在m個槽位上的均勻程度。這會兒我們先假定任何元素雜湊到m個槽中每乙個的可能性是相同的,且與其他元素已被雜湊到什麼位置上是獨立無關的。稱這個假設為簡單一致雜湊。
對於j=0,1,...,m-1,列表t[j](每個槽位對應的鍊錶)的長度用nj表示,這樣有:
nj的平均值為e[nj]=α=n/m。
假定可以在o(1)時間內計算出雜湊值h(k)(陣列下標),從而查詢具有關鍵字為k的元素的時間線性地依賴於表t[h(k)]的長度nh(k)。先不考慮計算雜湊函式和定址槽h(k)的o(1)時間,我們來看看查詢演算法期望查詢的元素數,即為比較元素的關鍵字是否為k而檢查的表t[h(k)]中的元素數。分兩種情況來考慮。在第一種情況中,查詢不成功:表中沒有乙個元素的關鍵字為k。在第二種情況中,查詢成功地找到關鍵字為k的元素。
定理11.1 對乙個用鏈結技術來解決碰撞的雜湊表,在簡單一致雜湊的假設下,一次不成功查詢的期望時間為o(1+α)。
證明:在簡單一致雜湊的假設下,任何尚未被儲存在表中的關鍵字k都是等可能地被雜湊到m個槽的任乙個之中。因而,當查詢乙個關鍵字k時,在不成功的情況下,查詢的期望時間就是查詢至鍊錶t[h(k)]末尾的期望時間,這一時間的期望長度為e[nh(k)]=α。於是,一次不成功的查詢平均要檢查α個元素,所需的總時間(包括計算h(k)的時間)為o(1+α)。
對於成功的查詢來說,情況略有不同,這是因為每個鍊錶並不是等可能地被查詢到的。某個鍊錶被查詢到的概率與它所包含的元素數成正比。然而,期望的查詢時間仍然是o(1+α)。
證明:假設要查詢的關鍵字是表中存放的n個關鍵字中任何乙個的可能性是相同的。在對元素x的一次成功的查詢中,所檢查的元素數比x所在的鍊錶中,出現在x前面的元素數多1。在該鍊錶中,出現在x之前的元素都是在x之後插入的,這是因為新的元素都是在表頭插入的。為了確定所查詢元素的期望數目,對x所在的鍊錶中,在x之後插入到表中的期望元素數加1,再對錶中的n個元素x取平均。設xi 表示插入到表中的第i 個元素,i=1,2,...,n,並設ki=key[xi]。對關鍵字ki和kj,定義指示器隨機變數xij=i。在簡單一致雜湊的假設下,有pr=1/m,從而根據引理5.1,有e[xij]=1/m。於是,在一次成功的查詢中,所檢查元素的期望數目為
這裡有幾點注意:
1.根據離散數學,計算乙個演算法在平均狀態下的計算複雜性,可以轉變成計算乙個隨機變數的期望值。設乙個實驗的樣本空間是可能輸入aj(j=1,2,...,n)的集合,且令隨機變數x對aj 賦值是aj 作為輸入時該演算法用到的操作次數。基於我們對輸入的了解,對每個可能的輸入aj 賦給乙個概率p(aj)。那麼該演算法在平均狀態下的複雜性是
2.根據證明的第一句可知每個可能的輸入的概率為1/n。也就是說x等於表中第i 個元素的概率是1/n。
3.指示器隨機變數xij=i的含義是如果i 和j 雜湊在同乙個槽位當中,也就是在同乙個鍊錶中時,加1次。
因此,綜上所述,在x之後插入到表中的所檢查元素的總數目為:
演算法在平均狀態下的所檢查元素的總數目為:
最後再計算這個式子的期望值就能得出所檢查元素的期望數目。於是,一次成功的查詢所需的全部時間(包括計算雜湊函式的時間)為o(2+α/2-α/2n)=o(1+α)。
演算法精解 10 鏈式雜湊表的應用 符號表
應用簡介 雜湊表會應用於編譯器中,滿足快速訪問符號資訊的需求。把原始碼中有組織的字元轉換為有意義的字串 語義轉換 一般儲存符號的兩個屬性 語義和標記型別。每次從輸入字串流中接收乙個字串,預設字串之間以空格隔開。如果該字串為全數字標價記為digit 否則為other。ifndef lex h defi...
演算法精解 C語言描述 鍊錶 迴圈鍊錶的實現與分析
同單鏈表相似,迴圈鍊錶中的每個元素也包含兩個部分 乙個資料域指標和乙個指向後繼元素的next指標。資料結構clistelmt代表迴圈鍊錶中的單獨元素。該結構體擁有兩個成員,如上面所述。資料結構clist代表迴圈鍊錶。這個結構體同單鏈表相似,但它不包含tail成員。clist.h ifndef cli...
演算法導論 簡單雜湊表的除法實現
雜湊表,又名雜湊表。hashtable。云云,看似非常高大上,事實上只是是直接定址的延伸而已。直接定址為何物,看乙個陣列 a 10 那麼取當中乙個元素a 1 這就是直接定址,直接去這個a 1的位址上,就找到了這個數值,時間複雜度為o 1 而雜湊表的目的就是要讓查詢的時間複雜度盡量往o 1 上靠。假如...