1. 程式人生 > 其它 >查詢演算法:折半查詢

查詢演算法:折半查詢

折半查詢,也稱二分查詢,是一種效率較高的查詢方法。

要求線性表必須採用 順序結構,表中元素按關鍵字 有序排列。

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\)