理论基础 —— 索引 —— 分块索引

【概述】

分块索引既适用于静态索引,又适用于动态索引。

在稠密索引中,索引项的个数与文件记录个数相同,空间代价很大,为减少索引项的个数,可以对文件分块,使分块有序。

分块有序,是指数据集的记录分为若干块,并且这些块满足两个条件:

  • 块间有序:后一块的所有记录的关键字要大于前一块的所有记录的关键字
  • 块内无序:每一块的记录不要求有序

在分块索引表中进行的查找称为分块查找,其分两步进行:

  1. 在索引表中确定待查关键码所在的块:块间是有序的,可使用二分查找、插值查找等提高效率
  2. 在相应块中查找待查关键码:块内是无序的,只能使用顺序查找

【方法】

对于分块有序的数据集,将每块对应一个索引项,其结构分为三个部分:

  • 最大关键码:存储每一块的最大关键字,以便在下一块中的最小关键字也能比这一块的最大关键字大
  • 块长:存储块中记录个数
  • 块首地址:指向块首数据元素的指针

【时间复杂度分析】

设 n 个记录的文件分成 m 个块,每个块内均有 t 条记录,则:n=m*t

设 Lb 为查找索引表确定关键码所在块的平均查找长度,Lw 为在块内查找关键码的平均查找长度,则分块查找的平均查找长度为:ASL=Lb+Lw

若采用顺序查找对索引表进行查找,则分块查找的平均查找长度为:ASL=L_b+L_w=\frac{m+1}{2}+\frac{t+1}{2}=\frac{1}{2}(\frac{n}{t}+t)+1

根据上面的式子可以发现,平均查找长度不仅取决于数据集的总记录数 n,还和每一个块的记录个数 t 有关,最佳的情况就是分的块数 m 与块中的记录数 t 相同,此时有:n=m*t=t*t

那么有:ASL=\frac{1}{2}(\frac{n}{t}+t)+1=t+1=\sqrt n+1

可见,分块查找的时间复杂度 O(√n) 比顺序查找的 O(n) 提高不少,但与二分查找的 O(logn) 相比还是有不小的差距,因此在确定块的过程中,由于块间有序,所以可以采用二分、插值等方法来提高效率。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值