分块查找法
定义与基本思想
分块查找法(Block Search)是一种结合顺序查找和索引查找的方法,适用于数据量较大的顺序表。其基本思想是:将表分为若干块,每块内元素无序,块间按某种规则有序,通过索引定位块,再在块内顺序查找。
分块查找法演示
块1:
371
块2:
958
块3:
121511
适用场景
- 适用于数据量较大的顺序表
- 适用于查找频繁、插入删除较少的场合
算法描述
- 将表分为 块,每块 个元素(最后一块可少于 个)
- 建立块索引表,记录每块的最大(或最小)关键字
- 查找时,先在索引表中定位目标所在块,再在该块内顺序查找
伪代码如下:
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; // 查找失败
}
平均查找长度(ASL)推导
设表长 n 分为 m 块,每块长度 。块间用索引(顺序查找),块内用顺序查找。
当 时(块数和块长都取 ),ASL 取最小值:
这就是分块查找能达到 的原因。
时间复杂度分析
- 建立索引表:
- 查找:(通常块数和块长均为 )
习题
习题 1
简述分块查找法的基本思想,并说明其适用场景。
答案与解析
解题思路:考查分块查找的原理和应用。
详细步骤:
- 将表分块,块内顺序查找,块间用索引定位
- 适用于大表、查找频繁、插入删除少
答案:分块+索引,先定位块再顺序查找,适合大表。
习题 2
某表有 个元素,分为 块,每块 个元素。若查找某元素,最多需要比较多少次?
答案与解析
解题思路:先查索引,再查块内。
详细步骤:
- 最多查 次索引,定位块
- 块内最多查 次
- 总共最多 次
答案:最多比较 次。
习题 3
分块查找法的查找过程包括哪两步?其查找效率如何?
答案与解析
解题思路:分块查找的流程和效率。
详细步骤:
- 先查索引表定位块
- 再在块内顺序查找
- 查找效率
答案:两步:查索引、查块内。效率 。
