1. 程式人生 > >[Data Structure & Algorithm] 線性表的查找

[Data Structure & Algorithm] 線性表的查找

高效率 線性表 struct list amp 二分查找 改變 arc 查找表

平均查找長度 ASL

影響查找算法好壞的主要標準 - 時間復雜度,通常用 - 平均查找長度

  • 定義 - 為確定記錄在查找表中的位置,需要和給定值進行比較的關鍵字的個數的期望
  • 公式 - ASL = (查找成功時 + 查找失敗時)的平均查找長度的期望
  • 基本概念
    • Ps - 查找成功時的概率
    • Pf - 查找失敗時的概率
    • Pi - 需要比較I次才能確定位置的記錄出現的概率
    • n - 查找表的長度
  • 好的算法
    • 可以改變 - Pi
      • 對於越小的i對應的Pi越大越好
    • 不可以改變 - Ps和Pf

線性表上的查找

  • 順序表
    • 具體實現
      • 從序列的最後開始從後往前依次比較
      • 設置監視哨 - 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個元素(每塊的元素個數不一定要相等)
      1. 索引表查找 - 折半查找 - 找到關鍵詞所屬的塊
      2. 塊中查找 - 順序查找
    • 平均查找長度 - log2(n/s + 1) + s/2
    • 優點 - 插入或刪除容易
    • 缺點
      • 增加索引表的存儲空間
      • 需要將線性表分塊排序

[Data Structure & Algorithm] 線性表的查找