-
条件:
- 将表分为几块,且表或者有序,或者分块有序(块间有序,块内无序);
分块有序含义: 若i<j,则第j块中所有记录的关键字均大于第i块中的最大关键字。 - 建立“索引表”,每个结点含有最大关键字域和指向本块第一个结点的指针,且按关键字有序。
- 将表分为几块,且表或者有序,或者分块有序(块间有序,块内无序);
-
查找过程:
先确定待查记录所在块(顺序或折半查找),再在块内查找(顺序查找)。
-
例子: 在上述表中查找值为38的元素。
方法:首先建立索引表如上图,把38与22比,38>22,所以该元素不在第1块,因为第1块的元素的最大值是22,与48比,38<48,则在第2块,然后在第二块里进行顺序查找。
- 性能分析:
分块查找的比较部分发生在两个步骤里,一个是关键字与索引表作比较,另一个是关键字逐个和块内元素作比较,所以查找效率为: A S L = L b + L w ASL=L_b+L_w ASL=Lb+Lw。-
L
b
L_b
Lb:对索引表查找的ASL。
L b = log 2 ( n s + 1 ) {L_b} = \log _2^{(\frac{n}{s} + 1)} Lb=log2(sn+1) -
L
w
L_w
Lw:对块内查找的ASL。
L w = s 2 L_w=\frac{s}{2} Lw=2s
其中,s为每块内部的记录个数, n / s n/s n/s即块的数目。 - 所以,分块查找的效率为,
A S L ≈ log 2 ( n s + 1 ) + s 2 ASL \approx \log _2^{(\frac{n}{s} + 1)} + \frac{s}{2} ASL≈log2(sn+1)+2s - 分块查找的效率介于折半查找和顺序查找之间,但更加接近于折半查找。
-
L
b
L_b
Lb:对索引表查找的ASL。
- 优缺点:
- 优点:插入和删除比较容易,无需进行大量的移动。
- 缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算。
- 适用情况:如果线性表既要快速查找又经常动态变化,则可采用分块查找。
- 三种查找方法的比较
顺序查找 | 折半查找 | 分块查找 | |
---|---|---|---|
ASL | 最大 | 最小 | 中间 |
表结构 | 有序表、无序表 | 有序表 | 分块有序 |
存储结构 | 顺序表、线性链表 | 顺序表 | 顺序表、线性链表 |