基本概念
- 关键字——数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。
- 静态查找表——仅关注查找速度即可
- 动态查找表——除了查找速度,也要关注插/删操作是否方便实现
ASL
- 查找长度——在查找运算中,需要对比关键字的次数称为查找长度
- 平均查找长度(ASL, Average Search Length)——所有查找过程中进行关键字的比较次数的平均值
- 查找算法的效率评价——通常考虑查找成功、查找失败两种情况下的ASL
顺序查找
- 顺序查找,又叫“线性查找”,通常用于线性表。
- 算法思想:从头到尾挨个找(或者反过来也OK)
Code
哨兵
- 可在0号位置存“哨兵”,从尾部向头部挨个查找
- 优点:循环时?需判断下标是否越界,效率更?
查找效率分析
优化(对有序表)
查找判定树
- 一个成功结点的查找长度=自身所在层数
- 一个失败结点的查找长度=其父节点所在层数
- 默认情况下,各种失败情况或成功情况都等概率发生
优化(被查概率不等)
- 可按被查概率降序排列
- 优点:查找成功时ASL更少
折半查找
折半查找,又称“二分查找”,仅适用于有序的顺序表。
Code
若 low>high 则查找失败
折半查找判定树
查找效率分析
折半查找不一定比顺序查找快哦!
分块查找
分块查找,又称索引顺序查找,算法过程如下:
- 在索引表中确定待查记录所属的分块(可顺序、可折半)
- 在块内顺序查找
用折半查找查索引
查找效率分析(简化)
ASL = 查索引表的平均查找长度+查分块的平均查找长度
动态查找表的处理
链式存储优于顺序存储,方便插入和删除操作 。
?
|