查詢表是由同一型別元素構成的集合。
本章給出了三種型別的查詢表:
為確定資料元素在列表中的位置,需和給定值進行比較的關鍵字個數的期望值,稱為查詢演算法在查詢成功時的平均查詢長度。由於查詢演算法的基本運算是關鍵字之間的比較操作,所以平均查詢長度是衡量查詢演算法的效能的重要指標。
計算平均查詢長度的基本公式:
對於長度為 n 的列表,查詢成功時的平均查詢長度為:
其中 pi 為查詢列表中第 i 個資料元素的概率,ci 為找到列表中第 i 個資料元素時,已經進行過的關鍵字比較次數。
計算方法:
針對具體的查詢問題,一般直接根據上述定義計算平均查詢長度,通常稱為手工計算方式。也可採用預先推導出的理**式進行計算,理**式一般基於合理的假設,通用但有一定誤差。雖然兩種方式在計算相同問題時得到的具體結果有一定差異,但都是基於相同的平均查詢長度定義,故應當掌握這些方法原則並能應用。
折半查詢法要求待查詢表應採用順序儲存結構且按關鍵字有序排列。
折半查詢過程借助於折半判定樹加以描述。判定樹中每一結點對應表中乙個記錄在表中的位置序號。
折半查詢演算法的效能:在等概率時查詢成功的平均查詢長度與折半判定樹的深度相關。
折半查詢演算法查詢速度快,平均效能好;插入刪除較困難。
二叉排序樹的定義:樹中左子樹上所有結點的值均小於根結點的值,樹中右子樹上所有=結點的值均大於根結點的值。
二叉排序樹的構建過程:從空樹開始,每次都從根開始比較插入(小於插入左子樹,大於插入其右子樹),逐一往樹中插入序列中所有結點。
二叉排序樹的構建形態:含有 n 個相同結點的二叉排序樹形態各異,其構造形態與數列的輸入順序有關。
二叉排序樹的特性:利用中序遍歷的定義與二叉排序樹的定義可知,對乙個二叉排序樹進行中序遍歷,可以得到結點值的遞增有序序列。
二叉排序樹的查詢過程:
二叉排序樹的查詢效能:與折半查詢過程類似,在二叉排序樹中查詢乙個記錄時,其比較次數不超過樹的深度。就平均效能而言,二叉排序樹上的查詢和折半查詢相差不大,平均查詢長度仍然是 o(log2n)。
二叉排序樹的插入、刪除操作無需移動大量結點,經常變化的動態表宜採用二叉排序樹結構。
普通二叉排序樹中各個分支的高度可能相差懸殊,而平衡二叉排序樹中各個分支的高度能夠始終保持平衡,從而保證較高的查詢效率。
結點的平衡因子是結點的左子樹深度與右子樹深度之差。在平衡二叉排序樹中,任意結點的平衡因子的絕對值小於等於 1。
在平衡二叉排序樹上插入乙個結點時可能導致失衡,有四種失衡型別及相應的調整方法。
**基本思想:**以元素的關鍵字 k 為自變數,通過雜湊函式 h,計算其儲存位置 p 即 p=h(k),從而實現按關鍵字計算的方式建立表與查詢表。雜湊表的查詢過程與雜湊表的建立過程對應一致。
致。雜湊法主要包括:
構造雜湊函式常用的方法有除留餘數法。處理衝突的基本方法包括線性探測再雜湊、二次探測再雜湊、鏈位址法等。
雜湊法中影響關鍵字比較次數的因素有三個:雜湊函式、處理衝突的方法以及雜湊表的裝填因子。其中設雜湊函式是均勻的,並且按處理衝突的方法分別考慮,則影響平均查詢長度的因素只剩下裝填因子α。雜湊表的平均查詢長度是裝填因子α的函式,而與待雜湊元素數目 n 無關。無論元素數目 n 有多大,都能通過調整α,使雜湊表的平均查詢長度較小。
本章典型題解主要以雜湊處理技術為基礎,展開平均查詢長度的公式計算法、手工計算法、演算法實現技術。
【例 1】為 1000 個記錄設計雜湊表,假設雜湊函式是均勻的,解決衝突用線性探測再雜湊法,並要求在等概率情況下查詢成功時的 asl 不超過 3,查詢不成功時的 asl 不超過 13,則雜湊表長度 m 應取多大?解:本題要求應用公式計算平均查詢長度。
已知雜湊函式是均勻的,且解決衝突用線性探測再雜湊法時,在等概率情況下查詢成功和查詢不成功時的平均查詢長度為:
解得α≤0.8,取α=0.8,由於 0.8=1000/m,所以 m=1250
需要指出的是,上述結果是在假設雜湊函式均勻的情況下得到的,當我們取定乙個具體的雜湊函式時,一般不會很均勻,所以實際構造的雜湊表的查詢效能會稍微差一些。
【例 2】對以下關鍵字序列建立雜湊表:(sun, mon, tue, wed, thu, fri, sat),雜湊函式為 h(k) =(k 中第乙個字母在字母表中的序號)mod 7。用線性探測法處理衝突,要求構造乙個裝填因子為 0.7 的雜湊表,並計算出在等概率情況下查詢成功的平均查詢長度。解:此題主要要求掌握手工計算平均查詢長度方法。
裝填因子為 0.7,根據公式:裝填因子=元素個數/表長,知雜湊表長度=7/0.7=10。各關鍵字第乙個字母的序號分別為 19(s)、13(m)、20(t)、23(w)、6(f)。
根據等概率下查詢成功的平均查詢長度計算公式可得
計算查詢不成功的平均查詢長度:
a. 對於雜湊函式取值為 0 時,查詢不成功時的比較次數為 2
b. 對於雜湊函式取值為 1 時,查詢不成功時的比較次數為 1
c. 對於雜湊函式取值為 2 時,查詢不成功時的比較次數為 2
d. 對於雜湊函式取值為 3 時,查詢不成功時的比較次數為 1
e. 對於雜湊函式取值為 4 時,查詢不成功時的比較次數為 1
f. 對於雜湊函式取值為 5 時,查詢不成功時的比較次數為 7
g. 對於雜湊函式取值為 6 時,查詢不成功時的比較次數為 6
根據等概率下查詢不成功的平均查詢長度計算公式可得
【例 3】已知某雜湊表的裝載因子小於 1,雜湊函式 h(key)為關鍵字(識別符號)的第乙個字母在字母表中的序號,處理衝突的方法為線性探測開放定址法。解:此題重在訓練演算法實現。1 編寫按第乙個字母的順序輸出雜湊表中所有關鍵字的演算法。
2 編寫模擬手工計算等概率情況下查詢不成功的平均查詢長度演算法。
解①:
【問題分析】
因雜湊表的裝載因子小於 1,雜湊表未滿。要實現按第乙個字母的順序輸出雜湊表中所有關鍵字的要求,可按字母序號從 1 到 26 的順序逐個找出對應每個序號的所有關鍵字的方式加以實現。
實現步驟:對字母序號為 i,可先從該字母序號位置開始判斷該處所存關鍵字的雜湊函式值是否為 i,若相同,則表示該關鍵字為與序號 i 對應的關鍵字,輸出該值,若不同,表示該關鍵字並非為字母序號 i 對應的關鍵字,不輸出。按線性探測開放定址法繼續判斷下乙個關鍵字,直到值為空。字母序號從 1 到 26 持續上述步驟,則可得乙個按字母順序輸出的所有關鍵字序列。
【演算法描述】
void
printword
(hashtable ht)
/*按第乙個字母的順序輸出雜湊表ht中的關鍵字,處理衝突的方法為線性探測開放定址法*/
}}
解②:【問題分析】
根據手工計算等概率情況下查詢不成功的平均查詢長度公式
知模擬手工計算查詢不成功的平均查詢長度可分為 3 步實現:先針對每個雜湊函式值,確定查詢不成功的比較次數,設乙個計數器 count 記錄比較次數;其次把對應每個雜湊函式值的比較次數相加得一總的比較次數;最後將總比較次數除以雜湊函式取值個數就可得查詢不成功的平均查詢長度。
【演算法描述】
float
unsucclength
(hashtable ht)
/*模擬手工計算在等概率情況下查詢雜湊表 ht 不成功的平均查詢長度演算法 */
asl = asl + count;
/*計算不成功查詢長度總和*/
} unasl =
(float
)asl/26;
/*求得不成功的平均查詢長度*/
return
(unasl)
;}
提高回顧與個人總結
專案 內容這個作業屬於哪個課程 這個作業的要求在 homework 3377 我在這個課程的目標是 完成課程中所要求的任務,通過該課程 這個作業在哪個具體方面幫助我實現目標 總結回顧 原部落格鏈結 關於bug的理解 關於psp 的理解 對於超大型軟體工程的理解 複審的理解 結對程式設計的理解 需求 ...
8 6省選模擬總結
今天被低2屆的虐暴了 感覺最近狀態有點低迷,做題速度低下.要多到網上刷題才行!第一題 刪數字 題目大意 給你乙個n 個數組成的序列v,要你刪除其中k 個數,m 表示剩下的數字中任意兩個數的差值的最大值,m 表示最小差值,要你計算刪除k 個數後,m m 的最小值。這題我一下在腦抽了.排序後可以發現若維...
提高組訓練總結
很好。明天就是旅遊了。今天寫個總結來概括一下這周訓練的收穫吧。訓練從11.13開始至11.17共5天。這5天每天都有一套模擬題。日期模擬題 分數總結收穫 11.13 sc theme park 210構圖 精確,簡潔,方便 11.14 dream team 290bfs 繼承,判斷,遞進 11.15...