为什么文件索引使用B树

https://moonshuo.cn/posts/63854.html

为什么提高文件索引

首先cpu不能和磁盘进行直接交互,需要通过缓存到内存中,在交给cpu进行处理,但是cpu的处理速度很快,而内存与磁盘之间需要读取特定的文件,但是如果磁盘查找文件的效率很慢,那么cpu就算运行速度再快,但是磁盘找文件的速度很慢,那么整个处理过程的速度就降了下来。

image-20220715112206845

其他数据结构不能做索引的原因

数组

文件按照数组的方式存放在磁盘中,地址空间连续

image-20220715112256217

假如说现在需要查找文件4,那么我需要从文件1开始进行线性查找,直到找到文件4,线性开销太大

而且现在需要删除文件2,文件3与4都需要迁移

哈希表

假如说我们现在定义了一个hash规则,Hash(key)=key%8

首先我们清楚哈希表时数组+链表的方式,那么假如说一个文件经过算法计算出hash值为9,那么就将存储到1的那个位置

image-20220715113209809

优点:查找单个等值查询非常快,比如我们要查找的文件hash值计算为3,那么我们可以一次性就查找出索引为3的位置的文件

缺点:这是一个hash表,无论中间计算的hash的过程多么好,但是避免不了hash冲突的问题,假如说上面这个算法插入文件10000个都在1处,那么查找最终的插入的一个文件就要比较10000次,反而成为了线性查找,效率低

如果仅仅是一个普通的树的话,那么还是需要按个进行遍历的

这个数并没有什么特殊的规律

二叉搜索树

二叉搜索树是要求每一个节点的左子节点比该节点小,右子节点比该节点大

image-20220715114509290

优点:平均时间下查找数据的速度很快,O(log n)

缺点:如果说插入的数据时候,按照从小到大是顺序进行插入,或者从大到小的顺序插入,那么查找效率是又成为了线性查找

二叉平衡树(AVL)

二叉平衡树要求左右子树高度差的绝对值为0或者1

优点:二叉平衡树很好的解决了二叉搜索树的问题,使得他的发查询效率不会出现极端的情况

缺点:每一次插入都需要检测是否满足平衡树,而且还要调整整个文件索引的结果(将树旋转,使其满足平衡),用插入的成本开销来换取查找的成本开销

所以说AVL树适合插入操作少,但是查询操作多的情况,但是文件索引系统肯定要同时兼顾两种情况

红黑树

对于上面的二叉平衡树,如果我们减少调整文件索引的次数,那么这样是不是就会更好??

红黑树:最长子树不超过最短子树的2倍即可

优点:此时红黑树对于相比较于平衡树的情况,旋转调整的次数比较少了

那么此时这样的红黑树是不是很完美了吗???

缺点:但是遇到大量的数据的时候,文件索引形成的红黑树深度会很深,那么此时查找的效率还是会很低

小总结

其实面对上述的三种树结构的各种问题,我们会发现他们都是二叉树,那么就会在成每一个节点的左右只能存储2个数据索引,这样的话,无论结构多么优化,文件增多,深度必将会增加,索引的效率也会下降

B树

终于把B树搞明白了(二)_什么是B树,B树的特点_哔哩哔哩_bilibili

满足下列要求的m叉树就是B树:

在有序树中的基础上每一个节点至多有m个孩子节点(至多含有m-1个关键字)

而对于B树来说,每一个节点结构如下

n(表示节点有多少个关键字)P0(第一个子树的地址)关键字1P1(第二个子树的地址)关键字2P…

下面是一个B树的结构

image-20220715121754431

那么对于B树来说,查找还是按照顺序大小来进行,比如说现在查找30

将第一行读入磁盘,发现30小于37,于是要读取地址1指向的结构

1地址137地址2

当把下面的结构读入地址之后,发现30大于25,于是查找地址2的结构

1地址125地址2

现在进入到这个结构之后,会发现30的文件,成功找到文件

2地址1 null30地址2 null35地址3 null

我们会发现这个B树的构成深度比二叉树的深度小了很多,那么比较的次数也会下降,IO次数也会下降,速度将会提高

当然B树也有缺陷,这些缺陷也是引入B+树的原因,这里不做解释

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值