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

平均查找长度 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
    • 优势 - 插入或删除容易
    • 缺点
      • 增长索引表的存储空间
      • 须要将线性表分块排序
相关文章
相关标签/搜索