目标:把这部分选择题压缩成固定套路。
重点:最大比较次数、比较序列、判定树、折半适用条件、分块最优块大小。
一、先背这一页
顺序查找:
成功ASL = (n+1)/2
折半查找:
必须"有序 + 随机访问"
最大比较次数 = ceil(log2(n+1))
折半判定树:
结点层数 = 成功比较次数
n个元素有n+1个失败位置
分块查找:
块间有序,块内可无序
顺序找索引 + 顺序找块内:
最优块大小 = √n
二、秒杀题型1:折半查找最多比较几次
直接:
最多比较次数
=
ceil(log2(n+1))
或者找最小h满足:
2^h - 1 >= n
真题1:2010年408
题目:
一个长度为16的有序顺序表,
采用折半查找查找一个不存在的元素,
关键字比较次数最多是多少?
选项:
A. 4
B. 5
C. 6
D. 7
秒杀
2^4-1 = 15 < 16
2^5-1 = 31 >= 16
所以:
最多5次
答案:
B
三、秒杀题型2:比较序列能不能出现
不要构造完整数组。
只维护:
key当前可能在哪个区间
真题2:2015年408第7题
题目:
下列选项中,
不能构成折半查找中关键字比较序列的是:
A. 500,200,450,180
B. 500,450,200,180
C. 180,500,200,450
D. 180,200,500,450
看A
500 -> 200
说明:
key < 500
然后:
200 -> 450
说明:
key > 200
所以现在:
200 < key < 500
下一次却去比较:
180
180已经不在:
(200,500)
这个合法区间里。
因此不可能。
答案:
A
口诀
每比较一次,
key的合法范围缩小一次。
后面的比较值
必须还落在当前合法区间。
四、秒杀题型3:折半判定树图形判断
看到四棵树,按这三关排:
第1关:
中序是否递增?
不是 -> 排除
第2关:
树是不是基本平衡?
严重偏斜 -> 排除
第3关:
偶数区间的mid取整规则是否始终一致?
一会儿向上,一会儿向下 -> 排除
2017年408第8题
题目要求判断:
哪棵二叉树可能成为折半查找判定树
正确答案:
A
这题最重要的坑就是:
同一棵判定树中,
mid取整规则必须统一。
五、秒杀题型4:600个元素最多比较几次
真题3:2023年408第8题
题目:
对含有600个元素的有序顺序表进行折半查找,
关键字比较次数最多是多少?
直接看:
2^9 = 512
2^10 = 1024
因为:
512 < 600 < 1024
所以:
最多比较10次
答案:
10
六、秒杀题型5:什么结构不能直接折半
第一反应:
折半查找 = 有序 + 随机访问
缺一不可。
真题4:2024年408第5题
题目给出:
I. 有序链表
II. 无序数组
III. 有序静态链表
IV. 无序静态链表
问哪些不适合直接使用折半查找。
I 有序链表
有序
但不能随机访问mid
不适合。
II 无序数组
能随机访问
但无序
不适合。
III 有序静态链表
虽然底层使用数组空间,但逻辑次序依赖:
游标 / next
不能把"逻辑第mid个元素"直接当普通数组下标访问。
不适合直接折半。
IV 无序静态链表
更不适合。
所以:
四种都不适合
答案:
D
秒杀口诀
折半只认:
有序 + 可以O(1)访问中间位置
七、秒杀题型6:分块查找最优块大小
如果:
n个元素
每块s个
且:
索引顺序查找
块内也顺序查找
直接:
最优 s = √n
真题5:2025年408第7题
题目:
查找表有400个元素,
均匀分块。
索引表用顺序查找,
块内也用顺序查找。
为了效率最高,
每块应包含多少元素?
直接:
√400 = 20
所以:
每块20个元素
答案:
C
八、顺序查找ASL题
等概率成功查找:
ASL = (n+1)/2
例如:
n = 11
则:
ASL = 6
九、有序顺序查找的失败判断
若表升序:
10 20 30 40 50
查找:
25
扫描到:
30
已经:
30 > 25
直接失败。
因此:
有序顺序查找
失败时不一定需要扫到表尾
十、折半路径题的统一草稿格式
每轮只写:
low mid high
然后:
key < A[mid]
-> high = mid-1
key > A[mid]
-> low = mid+1
直到:
找到
或:
low > high
不要在脑子里空算,容易把边界搞错。
十一、分块查找最容易记反的点
正确:
块内可以无序
块间必须有序
索引项通常记录:
块最大关键字
+
块起始地址
做题顺序:
先查索引
再进块内
一句话:
块内乱没事,块与块不能乱。
十二、五类真题压缩成五条规则
2010:
n=16求最多比较
-> ceil(log2(n+1))
-> 5
2015:
判断比较序列
-> 维护key合法区间
-> A不可能
2017:
判断折半判定树
-> BST + 平衡 + mid规则一致
-> A
2023:
600个元素最多比较
-> 512<600<1024
-> 10
2024:
折半适用结构
-> 有序 + 随机访问
-> 四种都不适合,D
2025:
400元素分块最优
-> √400
-> 20
十三、考场一页纸
【顺序查找】
成功ASL = (n+1)/2
最通用
链表也能用
【折半查找】
有序 + 随机访问
O(log n)
最大比较次数 = ceil(log2(n+1))
判定树:
层数 = 成功比较次数
n个元素有n+1个失败位置
比较序列:
维护key当前合法区间
判定树图:
BST + 基本平衡 + mid规则一致
【分块查找】
块间有序
块内可无序
顺序索引 + 顺序块内:
最优块大小 = √n
十四、强化阶段复习优先级
第一优先:
折半查找过程
最大比较次数
折半判定树
第二优先:
折半适用条件
比较序列
第三优先:
分块查找√n公式
第四优先:
顺序查找ASL
做到:
看到题型
-> 立刻认规则
-> 十几秒完成
这部分就够稳了。