408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题

目标:把这部分选择题压缩成固定套路。

重点:最大比较次数、比较序列、判定树、折半适用条件、分块最优块大小。


一、先背这一页

复制代码
顺序查找:
成功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

做到:

复制代码
看到题型
-> 立刻认规则
-> 十几秒完成

这部分就够稳了。

相关推荐
卷心菜的学习路3 小时前
基于多模态向量检索的数学相似题推荐系统:完整设计、算法与实验
java·python·算法·大模型·推荐算法·数学相似题
小南知更鸟3 小时前
【leetcodehot100】leetcode-hot100-20260809更新
算法·leetcode·职场和发展
数模竞赛Paid answer3 小时前
2021年深圳杯数学建模A题火星探测器着陆控制方案解题全过程论文及程序
算法·数学建模·深圳杯
hold?fish:palm3 小时前
19 螺旋矩阵
线性代数·算法·矩阵
hold?fish:palm3 小时前
链表的基本原理和实现(C++版本)
数据结构·c++·链表
码完就睡4 小时前
数据结构——树、二叉树基础概念
数据结构·算法
VL——MOESR5 小时前
【LuoguP1967】货车运输【生成树】【倍增】
c++·算法·题解·倍增·生成树
手写码匠5 小时前
华为云Flexus+DeepSeek征文|Agent 记忆系统实战:用 DeepSeek-R1/V3 + Dify 会话变量打造跨会话长期记忆
人工智能·深度学习·算法·aigc
Olafur_zbj5 小时前
【AI】CUDA编程中的维度
人工智能·算法