[Data Structure & Algorithm] 線性表的查詢
阿新 • • 發佈:2018-11-08
平均查詢長度 ASL
影響查詢演算法好壞的主要標準 - 時間複雜度,通常用 - 平均查詢長度
- 定義 - 為確定記錄在查詢表中的位置,需要和給定值進行比較的關鍵字的個數的期望
- 公式 - ASL = (查詢成功時 + 查詢失敗時)的平均查詢長度的期望
- 基本概念
- Ps - 查詢成功時的概率
- Pf - 查詢失敗時的概率
- Pi - 需要比較I次才能確定位置的記錄出現的概率
- n - 查詢表的長度
- 好的演算法
- 可以改變 - Pi
- 對於越小的i對應的Pi越大越好
- 不可以改變 - Ps
- 可以改變 - Pi
線性表上的查詢
- 順序表
- 具體實現
- 從序列的最後開始從後往前依次比較
- 設定監視哨 - SeqList[0] = key;
- 目的 - 避免在迴圈中每次都檢查是否越界,執行更快
- 近似查詢概率 - 訪問頻率
- 平均查詢長度 - (n+1)/2
- 優點 - 演算法簡單而適用範圍廣
- 缺點 - 平均查詢長度較大,尤其是n很大時
- 具體實現
- 有序表
- 基本思路 - 二分查詢(折半查詢)
1.設L[low..high]為當前查詢區間,則mid = (low+high)/2
2.將要查詢的key值與L[mid]進行比較,
- 如果相等,返回mid
- 如果key < L[mid],high = mid -1
- 如果key > L[mid],low = mid + 1
3.重複1,直到找到key值,或者low>high - 判定樹 - 將mid作為二叉樹的根
- 無論查詢成功或失敗,比較次數都不會超過判定樹的深度log2(n+1)
- 平均查詢長度 = log2(n+1) - 1
- 優點 - 查詢效率高
- 缺點 - 只適用於順序有序表,不能用鏈式儲存
- 前期排序費時 - 高效率的排序方法也要O(nlog2n)
- 如果需要插入和刪除,都必須移動大量結點
- 適用 - 插入和刪除操作特別少的線性表
- 基本思路 - 二分查詢(折半查詢)
- 索引順序表
- 基本思路 - 分塊查詢(Blocking Search)
- 儲存結構
- 索引表
- 索引項 - 資料域(塊中的最大值)|地址域(塊中第一個值的位置)
- 索引表是有序的
- 分塊後的線性表 - 與索引表對應
- 長度為n的線性表分為b塊,每塊含有s個元素(每塊的元素個數不一定要相等)
- 索引表
- 索引表查詢 - 折半查詢 - 找到關鍵詞所屬的塊
- 塊中查詢 - 順序查詢
- 儲存結構
- 平均查詢長度 - log2(n/s + 1) + s/2
- 優點 - 插入或刪除容易
- 缺點
- 增加索引表的儲存空間
- 需要將線性表分塊排序
- 基本思路 - 分塊查詢(Blocking Search)