数据结构day6——索引技术

 1.线性索引

线性索引的索引文件是一组顺序的关键码/指针对,按照关键码进行排序,指针指向磁盘中的完整记录。

1)一维数组线性索引

局限性:可能会太大了导致无法存到主存,只能存到磁盘,哪怕使用二分检索,造成的IO代价也很高。

解决办法:二级索引;二级索引是存储目标关键码的索引文件所在的磁盘块的。比如说,一个线性索引文件占据磁盘中的一百块,则二级索引文件中就要保存一百项,每一项中存储的是该块的第一个位置的关键码值。每次检索时先检索二级索引(二级索引文件相对较小,可存在主存中),查到关键码所在的块号,再从磁盘中读出此块,再二分检索到实际关键码,通过指针再从磁盘中 得到完整记录。

线性索引的插入与删除效率:在往数据库中添加或删除一条记录时,要保持线性索引的线性顺序,二级索引表也需要更新,整个线性索引表都需要相对新插入的关键码所在位置进行移动。

另一个问题是线性索引中存在重复码,比如性别女,这样的记录可能有多条。

2)二维数组线性索引

二维数组:针对上述问题的改进,一行对应一个辅码,和一些主码。这样每行的辅码就不会重复了。如果要插入一个对应的辅码的记录的话,只需要在对应的辅码后面,将这条记录的主码值添上即可。当且仅当新添加的辅码未在二维数组索引中出现过的时候,才会移动数组中的多行以保持有序。

二维数组索引的缺陷:因为每行大小是固定的,每行大小至少应该比数据库中拥有相同辅码的最大记录数大1.所以那些相关辅码记录数比数组长度小的,就会浪费一些数组空间。

3)倒排表

分为辅码索引表和主码索引表。是指辅码索引表中的一项指向一组主码值,每个主码指向一个完整记录。 

2.ISAM

磁盘按照柱面进行组织,每个柱面维护一个表,该表存储了柱面中每个块中存储的关键码的最小值。除此之外每个柱面维护一个溢出表。

查询时,先通过主存中的索引表,根据关键码查出其所在的柱面,再访问柱面中的索引表,查出该关键码所在的块,如果在块中没有找到就检查溢出表,柱面溢出表中找不到就查找系统级溢出表。

3.树形索引

1)2-3树

2-3树的特征:a 一个结点包含一个或两个关键码;b 每个内部结点(当其只有一个关键码时)有2个子女,或者3个子女(有两个关键码时);c 所有叶结点都在树的同一层,因此树的高度总是平衡的。

2-3树有与BST相似的排序特征:左子树中的值全部小于根结点的第一个关键码值,中子树(如果有)中的值全部大于等于第一个关键码的值,且小于第二个关键码的值。右子树的所有值大于等于第二个关键码的值。

一个高度为k的2-3树至少2^(k-1)个结点,至多3^(k-1)个结点。 

2-3树的插入:将新加入的关键码添加到到对应位置的叶结点即可。如果该叶结点已经有两个关键码了,则分裂该叶结点为两个,左边的结点放最小的一个关键码,右边的结点放最大的关键码,中间的关键码则提升到父结点中去;如果父结点已满,则再对父结点做一次分裂提升,重复此过程直到关键码可以被放下。

2-3树的删除:和BST的删除类似。

2)B树

B树的特点:所有叶结点都在同一层;更新和检索只影响一些磁盘页,性能很好;相关记录放在同一个磁盘中,利用访问性局部原理;

m阶B树:根结点要么是叶结点,要么必有两个子女;内部结点必有m/2到m个子女,树高是平衡的;每个结点最多m-1个关键码

所以说,2-3树实际上就是3阶的B树。

B树的检索:在当前结点对关键码进行二分搜索,如果找到关键码,就返回这条记录,(如果是叶结点且没有找到对应的关键码,则返回检索失败);再从此正确分支继续向下搜素。

B树的插入也和2-3树的套路是一样的,拆分-->提升法。

3)B+树

B+树,特点是只在叶结点中存储数据(实际记录或指向实际记录的指针)。内部结点存储关键码值,只做引导检索的作用。

m阶的B+树中的叶结点可存储小于大于等于m记录数,且叶结点一般会链接起来,形成双链表,这样的话遍历此双链表就会得到有序的记录。 

B+树的插入,也是拆分提升法,如果插入的结点满了,就将其均分为两个结点,将右边结点中最小的关键码提升到父结点中去,以此类推。

B+树的删除:由于B+树的记录数至少半满,所以是存在一个下限的,如果删除了结点后已经到达了下限,就会导致下溢,这时需要采取一定措施保持结点足够满。第一选择是查看兄弟节点看其是否有多余记录以填补这个空缺,一般取兄弟结点所拥有的一半记录,这也会导致可能要修改父结点的值,以反映每个结点真正的第一个关键码值。如果说没有兄弟结点是可以借记录的,那就将此结点中的记录与兄弟结点合并,并删除此结点。合并可能导致父亲结点的数目不符合结点数目下限了,同样也看兄弟结点有没有子结点可以借用的。这个过程要一直保持所有父亲结点的存储关键码正确。

4)B*树,B*树 

B*树与B+树的差别是,在插入上溢时不分裂,而是将记录分给兄弟结点,如果兄弟结点也满了,就将这两个结点分成三个结点。同样,下溢的时候,就另外两个兄弟结点合并,从3个变成2个结点。

5)B树的分析,3类B树的操作代价都是O(logn)。

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值