平均查找长度 ASL
影响查找算法好坏的主要标准 - 时间复杂度,一般用 - 平均查找长度算法
- 定义 - 为肯定记录在查找表中的位置,须要和给定值进行比较的关键字的个数的指望
- 公式 - ASL = (查找成功时 + 查找失败时)的平均查找长度的指望
- 基本概念
- Ps - 查找成功时的几率
- Pf - 查找失败时的几率
- Pi - 须要比较I次才能肯定位置的记录出现的几率
- n - 查找表的长度
- 好的算法
线性表上的查找
- 顺序表
- 具体实现
- 从序列的最后开始从后往前依次比较
- 设置监视哨 - 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
- 优势 - 插入或删除容易
- 缺点