查詢演算法:折半查詢
阿新 • • 發佈:2021-06-21
折半查詢,也稱二分查詢,是一種效率較高的查詢方法。
要求線性表必須採用 順序結構,表中元素按關鍵字 有序排列。
int Search_Bin (SSTable ST, KeyType key) { int low = 1, high = ST.length; while (low <= high) { // 注意不是low<high,因為low=high時,查詢區間還有最後一個結點,還要進一步比較 int mid = (low + high) / 2; if (ST[mid].key == key) return mid; else if (ST[mid].key > key) high = mid - 1; else (ST[mid].key < key) low = mid + 1; } return 0; }
注:該演算法可改為遞迴實現
演算法分析:
折半查詢過程可用二叉樹來描述,結點值不是記錄的關鍵字,二是記錄在表中的位置序號。
把當前查詢區間的中間位置作為根,左子表和右子表分別作為根的左子樹和右子樹,由此得到的二叉樹稱為折半查詢的判定樹。
藉助判定樹,易得折半查詢的平均查詢長度。
假設有序表的長度\(n=2^h - 1\),則判定表的深度\(h=log_2(n+1)\)的滿二叉樹。
樹中層次為\(1\)的結點有\(1\)個,層次為\(2\)的結點有\(2\)個,...,層次為\(h\)的結點有\(2^{h-1}\)個。
平均查詢長度\(ASL=\sum_{i=1}^{n}{P_iC_i} = \frac{i}{n}\sum_{j=1}^{h}{j·2^{j-1}} = \frac{n+1}{n}log_2(n+1)-1\)
當n較大時,可有下列近似結果\(ASL=log_2(n+1)-1\)