[Data Structure & Algorithm] 線性表的查找
阿新 • • 發佈:2018-10-21
高效率 線性表 struct list amp 二分查找 改變 arc 查找表
平均查找長度 ASL
影響查找算法好壞的主要標準 - 時間復雜度,通常用 - 平均查找長度
- 定義 - 為確定記錄在查找表中的位置,需要和給定值進行比較的關鍵字的個數的期望
- 公式 - ASL = (查找成功時 + 查找失敗時)的平均查找長度的期望
- 基本概念
- Ps - 查找成功時的概率
- Pf - 查找失敗時的概率
- Pi - 需要比較I次才能確定位置的記錄出現的概率
- n - 查找表的長度
- 好的算法
- 可以改變 - Pi
- 對於越小的i對應的Pi越大越好
- 不可以改變 - Ps和Pf
- 可以改變 - 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
- 無論查找成功或失敗,比較次數都不會超過判定樹的深度log2
- 平均查找長度 = log2(n+1) - 1
- 優點 - 查找效率高
- 缺點 - 只適用於順序有序表,不能用鏈式存儲
- 前期排序費時 - 高效率的排序方法也要O(nlog2n)
- 如果需要插入和刪除,都必須移動大量結點
- 適用 - 插入和刪除操作特別少的線性表
- 基本思路 - 二分查找(折半查找)
- 索引順序表
- 基本思路 - 分塊查找(Blocking Search)
- 存儲結構
- 索引表
- 索引項 - 數據域(塊中的最大值)|地址域(塊中第一個值的位置)
- 索引表是有序的
- 分塊後的線性表 - 與索引表對應
- 長度為n的線性表分為b塊,每塊含有s個元素(每塊的元素個數不一定要相等)
- 索引表
- 索引表查找 - 折半查找 - 找到關鍵詞所屬的塊
- 塊中查找 - 順序查找
- 存儲結構
- 平均查找長度 - log2(n/s + 1) + s/2
- 優點 - 插入或刪除容易
- 缺點
- 增加索引表的存儲空間
- 需要將線性表分塊排序
- 基本思路 - 分塊查找(Blocking Search)
[Data Structure & Algorithm] 線性表的查找