[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
    • 优点 - 插入或删除容易
    • 缺点
      • 增加索引表的存储空间
      • 需要将线性表分块排序
posted @ 2018-10-21 10:53  break大蜗牛  阅读(284)  评论(0编辑  收藏  举报