平均查找长度:
一次查找的长度:需要比较的关键字次数
平均查找长度ASL:所有查找过程中进行关键字的比较次数的平均值
顺序查找
一般线性表的顺序查找
缺点:当n较大时,平均查找长度较大,效率低
优点:顺序存储和链式存储都可以
ASL成功=(n+1)/2
ASL失败=n+1
有序表的顺序查找
ASL成功=(n+1)/2
ASL失败=n/2+n/(n+1)
有序表的顺序查找,查找成功的平均查找长度和一般线性表的顺序查找一样
每个元素查找成功的比较次数只与其位置有关,与其是否有序无关
折半查找
仅适用于有序的顺序表
折半查找可以用判定树描述,判定树是一颗平衡二叉树
每次把一个数组从中间节点分割,总是把数组分为节点数相差最多不超过1的两个子数组
- 查找成功时的平均长度:从根节点到目的节点的路径上的节点数
- 查找失败:从根节点到对应失败节点的父节点路径上的节点数
每个节点值均大于其左子节点值,且均小于右子节点值;
n个元素,n个非叶节点,n+1个叶节点
折半查找法查找到给定值的比较次数最多不会超过树的高度
ASL成功=(1/n)(11+2+2+…+h+2^(h-1))=log2(n+1)-1
h=log2(n+1)向上取整
时间复杂度O(log2n),比顺序查找效率高
仅适合顺序存储结构,不适合链式(需要方便的定位查找区域,要求线性表具有随机存取的特性)
分块查找
块内元素可以无序,块之间是有序的
计算的ASL看书p275
王道做题总结
7.2.4
- 折半查找大部分情况下比顺序查找快,某些特殊情况(查找含1000个元素的有序表的第一个元素,顺序查找比较次数为1,折半查找比较次数将近10次)
- 折半查找和二叉排序树的时间性能:有时不相同
二叉排序树的查找性能与数据的输入顺序有关,最好情况下的平均查找长度和折半查找相同,最坏情况是形成单支数,查找长度O(n)
- 采用折半查找法查找不存在的元素,求最多最少的比较次数
法1:
画出查找过程中构成的判定树,最小的分支高度对于最少的比较次数,最大的分支高度对应最多的比较次数。(若出现长度为15的顺序表,判定树刚好是一棵满树,最多比较次数和最少比较次数相同)
法2:
公式,最大分支高度h=log2*(n+1)向上取整,由于判定树不是一颗满树,因此最小分支高度h-1 - 求折半查找查找成功或失败的平均查找长度
画出判定树 - 【题型】给二叉树,可能成为折半查找判定树的是
方法:折半查找判定树实际上是一棵二叉排序树,他的中序序列是一个有序序列,可以在树节点上依次填上相应的元素,符合折半查找规则的树即为所求。 - 分块查找中,索引项和索引块内部都采用折半查找,则查找效率最高