[Data Structure & Algorithm] 线性表的查找
平均查找长度 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(n+1)
- 平均查找长度 = log2(n+1) - 1
- 优点 - 查找效率高
- 缺点 - 只适用于顺序有序表,不能用链式存储
- 前期排序费时 - 高效率的排序方法也要O(nlog2n)
- 如果需要插入和删除,都必须移动大量结点
- 适用 - 插入和删除操作特别少的线性表
- 基本思路 - 二分查找(折半查找)
- 索引顺序表
- 基本思路 - 分块查找(Blocking Search)
- 存储结构
- 索引表
- 索引项 - 数据域(块中的最大值)|地址域(块中第一个值的位置)
- 索引表是有序的
- 分块后的线性表 - 与索引表对应
- 长度为n的线性表分为b块,每块含有s个元素(每块的元素个数不一定要相等)
- 索引表
- 索引表查找 - 折半查找 - 找到关键词所属的块
- 块中查找 - 顺序查找
- 存储结构
- 平均查找长度 - log2(n/s + 1) + s/2
- 优点 - 插入或删除容易
- 缺点
- 增加索引表的存储空间
- 需要将线性表分块排序
- 基本思路 - 分块查找(Blocking Search)