平均查找長度 ASL
影響查找算法好壞的主要標準 - 時間複雜度,一般用 - 平均查找長度算法
- 定義 - 爲肯定記錄在查找表中的位置,須要和給定值進行比較的關鍵字的個數的指望
- 公式 - ASL = (查找成功時 + 查找失敗時)的平均查找長度的指望
- 基本概念
- Ps - 查找成功時的機率
- Pf - 查找失敗時的機率
- Pi - 須要比較I次才能肯定位置的記錄出現的機率
- n - 查找表的長度
- 好的算法
線性表上的查找
- 順序表
- 具體實現
- 從序列的最後開始從後往前依次比較
- 設置監視哨 - 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
- 優勢 - 插入或刪除容易
- 缺點