分块查找法
分块查找法(Block Search)是一种结合顺序查找和索引查找的方法,适用于数据量较大的顺序表。其基本思想是:将表分为若干块,每块内元素无序,块间按某种规则有序,通过索引定位块,再在块内顺序查找。
点击“执行一步”观察算法状态变化。
- 适用于数据量较大的顺序表
- 适用于查找频繁、插入删除较少的场合
- 将表分为 块,每块 个元素(最后一块可少于 个)
- 建立块索引表,记录每块的最大(或最小)关键字
- 查找时,先在索引表中定位目标所在块,再在该块内顺序查找
伪代码如下:
for i = 0 to m-1:
if x <= index[i]:
// 在第i块内顺序查找
for j = block[i].start to block[i].end:
if A[j] == x:
return j
break
return -1
// 分块查找:index[] 为索引表(每块最大关键字),start/end 为每块范围
int BlockSearch(int A[], int n, int blockSize, int index[], int m, int key) {
int block = -1;
// ① 在索引表中定位所在块(顺序查找)
for (int i = 0; i < m; i++) {
if (key <= index[i]) {
block = i;
break;
}
}
if (block == -1) return -1; // 超过所有块的最大值
// ② 在块内顺序查找
int start = block * blockSize;
int end = (start + blockSize < n) ? start + blockSize : n;
for (int j = start; j < end; j++) {
if (A[j] == key) return j;
}
return -1; // 查找失败
}
设表长 n 分为 m 块,每块长度 。块间用索引(顺序查找),块内用顺序查找。
当 时(块数和块长都取 ),ASL 取最小值:
这就是分块查找能达到 的原因。
- 建立索引表:
- 查找:(通常块数和块长均为 )
习题 1
简述分块查找法的基本思想,并说明其适用场景。
解题思路:
本题考查分块查找的基本思想与适用场景。分块查找把查找拆成“定位块”和“在块内查找”两层,块间用索引表组织、块内用顺序查找,从而在大表上兼顾效率与实现简洁。
详细步骤:
- 将表分块,块内顺序查找,块间用索引定位
- 适用于大表、查找频繁、插入删除少
- 补充:索引表记录每块的关键字范围和起始地址,因此可先由待查关键字确定它所在的块,再在该块内顺序查找;代价是插入和删除需要维护索引,块数与块长的选取会直接影响实际效率。
最终答案:
分块+索引,先定位块再顺序查找,适合大表。
习题 2
某表有 个元素,分为 块,每块 个元素。若查找某元素,最多需要比较多少次?
解题思路:
本题考查分块查找的最坏比较次数。思路是把总比较次数拆成两部分:确定目标所在块的索引比较次数,加上在该块内部顺序查找的比较次数,两者相加即得最坏情况。
详细步骤:
- 最多查 次索引,定位块
- 块内最多查 次
- 总共最多 次
- 说明:索引表共 10 项,顺序比较最多 10 次即可定位到块;块内含 10 个元素,顺序查找最多再比较 10 次,两段相加就是最坏情况下的 20 次比较。
最终答案:
最多比较 次。
习题 3
分块查找法的查找过程包括哪两步?其查找效率如何?
解题思路:
本题要求说明分块查找的流程与效率。流程上分块查找固定为两步,效率上则是这两步代价之和——当块数与块长都取 量级时达到最优。
详细步骤:
- 先查索引表定位块
- 再在块内顺序查找
- 查找效率
- 补充:当表分为约 块、每块约 个元素时,索引比较与块内比较各为 ,合计 ,这正是分块长度的最优取法。
最终答案:
两步:查索引、查块内。效率 。
