ad09只在一定范围内查找相似对象_查找

一、折半查找

折半查找又称二分查找,它仅适用于有序的顺序表。

顺序表具有随机访问的特性,可以通过数组下标直接找到对应的元素。

算法思想:首先将给定值key与表中中间位置的元素比较,若相等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分。然后缩小查找范围继续查找,如此重复,直到找到元素为止。

180b9b913a28804c74b97d906ad74bf5.png

折半查找效率分析

折半查找效率首先要构造出查找判定树,然后计算查找判定树的ASL。

f10a0fbe06d8588519c794faf3e49b0c.png

折半查找的判定树的构造

注:由于折半查找是按照位置查找,所以当序列个数和取整方式确定时,对应的判定树一定是确定的。

且元素相同的序列,两种不同的取整方式得到的查找判定树不仅在形状上,每个元素的位置都是完全对称的。

如果当前low和high之间有偶数个元素,则mid分隔后,左右两部分元素个数相等。

如果当前low和high之间有偶数个元素,则mid分隔后,左办部分比右半部分少一个元素。

因此,在折半查找的判定树中,若mid = (low+high)/2向下取整,则对于任何一个结点,必有:

右子树结点数-左子树结点数 = 0或1

注:若mid = (low+high)/2向上取整,则结论相反左子树结点数-右子树结点数 = 0或1

677100eb7f6b84835c90014d020b9606.png

根据上述结论可以构造出折半查找的判定树。

f31f7c82d94435d8a2106a394e49c46e.png

如上图为16个元素的顺序表所对应的折半查找判定树。

可以看出

1、折半查找的判定树一定是平衡二叉树AVL树

2、折半查找判定树中,只有最下面一层是不满的,因此树高的计算和完全二叉树一样,元素个数为n时,树高h =log2(n+1)向上取整或log2n+1向下取整。

3、折半查找的判定树也是一种二叉排序树。

4、失败结点个数 = 成功结点的空链域数量 = 结点个数n+1

5、折半查找中关键字比较序列其实就是对应查找判定树的路径一个查找路径,而判定树是二叉排序树,因此比较序列必须满足二叉排序树的查找序列的性质。

至于如何判断序列满足二叉排序树的查找序列见二叉排序树。

折半查找的时间复杂度

注:不能说折半查找的速度一定比顺序查找快。

折半查找的性能分析可以用二叉判定树来衡量,平均查找长度和最大查找长度都是O(log2n),二叉判定树是一种二叉排序树,但二叉排序树的查找性能和数据的输入顺序有关,最好情况下平均查找长度和折半查找相同,但最坏情况即形成单支树时,其查找长度为O(n)。

事实上,折半查找的性能与平衡二叉树的性能相同。

二、分块查找

分块查找又称索引顺序查找(分块构成索引表,块内部使用顺序查找),它吸取了顺序查找和折半查找的优点,既有动态结构,又适于快速查找。

原理:将序列分为多块,每一块对应索引表中一个表项,取每一块中最大的关键字作为索引表项的关键字,取块元素的首尾地址作为分界区间(或只有首地址)。

e36ccd839ef4f81e326a5667a2cbe3b9.png

特点:块内无序、块间有序

注:因为块内无序,所以块内只能用顺序查找

对索引表的查找

由于索引表是有序的,因此索引表的查找可以使用折半查找或顺序查找。顺序查找没啥好说的,主要说一下折半查找。

用折半查找查索引表

cc79cd8cfe9f874b78a1814f664d0fb2.png

若索引表中不包含目标关键字,则折半查找索引表最终停在low>high,要在low所指分块中查找!

为啥要在low所指分块中查找?

low>high之前肯定是low=high=mid。这时候有两种情况:mid>key时high--和midhigh时,low左边一定小于目标关键

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值