查找:从数据集合寻找满足某种条件的数据元素的过程
查找表:查找对象
静态查找表:查找表只需要进行查找操作,不需要动态修改数据。需要动态增加删除数据称为动态查找表
关键字:数据集合唯一标识一条数据的数据项
算法评价指标:平均查找长度ASL.
通常从查找成功的ASL与查找失败的ASL两方面考虑(需要会计算)
ASL = 累加:出现概率*判定次数
顺序查找
按排列顺序一个一个查找,通常用于顺序表
适用于顺序表,线性表,有序无序都可以。
有序可以进行优化,比如按照递增排序,查找到一个点,如果大于查找目标值,那么后续肯定都没有,可以退出。
时间复杂度O(N)
二分查找
用于递增或者递减排序的序列,不支持链表,因为需要具有随机存取这个特点。
算法过程:
- 初始化区间左端点与右端点,表示数据可能存在的范围。
- 判断区间中点值是否符合查找目标,如果符合直接退出循环
- 按照中点值进行区间更新,以递增为例,如果中点值大于查找值,说明区间右侧都比查找值大,可以将区间右侧端点更新至终点左侧一个单位。如果小于,就可以将左端点更新至中点右侧一个单位。
- 循环2,直至区间不合法。
判定树
即根据判定走势生成的一个树。
计算中点通常向下取整。
当为奇数个时候,左右子树个树相同,当偶数个时候,右子树比左子树多1.如果中点计算向上取整就相反
二叉判定树符合平衡二叉树。树高为log(n+1)向上取整
判定树可以用来计算ASL。
树高即为时间复杂度,所以数量级为O(logn)
索引查找
也就是分块查找。特点:块间有序,块内可以有序可以无序。
索引表通常存区间的右端点,即每一个分块内部最大关键字。
所以可以先查询索引再根据索引查找到块,再进行块内查找。
因为索引肯定是有序的,所以可以使用二分查找,也可以直接顺序查找。
如果使用二分查找,查找过程可能很复杂,因为索引可能不含有值,只需要找到索引值比查找值大的点,找到这个点 也就找到了块。所以,二分查找针对索引进行查找kennel失败,但查找失败最后的low一定是指向分块区间的索引。
ASL:查索引的ASL + 查块内的ASL
如果每一个块内含有的个数相同,且索引使用顺序查找,那么一个块内存根号N的单元能够使得ASL达到最小值。