【概述】
分块索引既适用于静态索引,又适用于动态索引。
在稠密索引中,索引项的个数与文件记录个数相同,空间代价很大,为减少索引项的个数,可以对文件分块,使分块有序。
分块有序,是指数据集的记录分为若干块,并且这些块满足两个条件:
- 块间有序:后一块的所有记录的关键字要大于前一块的所有记录的关键字
- 块内无序:每一块的记录不要求有序
在分块索引表中进行的查找称为分块查找,其分两步进行:
- 在索引表中确定待查关键码所在的块:块间是有序的,可使用二分查找、插值查找等提高效率
- 在相应块中查找待查关键码:块内是无序的,只能使用顺序查找
【方法】
对于分块有序的数据集,将每块对应一个索引项,其结构分为三个部分:
- 最大关键码:存储每一块的最大关键字,以便在下一块中的最小关键字也能比这一块的最大关键字大
- 块长:存储块中记录个数
- 块首地址:指向块首数据元素的指针
【时间复杂度分析】
设 n 个记录的文件分成 m 个块,每个块内均有 t 条记录,则:n=m*t
设 Lb 为查找索引表确定关键码所在块的平均查找长度,Lw 为在块内查找关键码的平均查找长度,则分块查找的平均查找长度为:ASL=Lb+Lw
若采用顺序查找对索引表进行查找,则分块查找的平均查找长度为:
根据上面的式子可以发现,平均查找长度不仅取决于数据集的总记录数 n,还和每一个块的记录个数 t 有关,最佳的情况就是分的块数 m 与块中的记录数 t 相同,此时有:n=m*t=t*t
那么有:
可见,分块查找的时间复杂度 O(√n) 比顺序查找的 O(n) 提高不少,但与二分查找的 O(logn) 相比还是有不小的差距,因此在确定块的过程中,由于块间有序,所以可以采用二分、插值等方法来提高效率。