数据可索引之二叉查找树

数据库索引之二叉查找树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tYhU6a9N-1632114379452)(ms图库/二叉树.jpg)]

众所周知二叉查找树是是每个节点最多由两子树的树结构,通常子树被称为左子树和右子树。二叉查找的重要性就是,对于树中的每一个节点x(如上图 5,2,7,6,9)他的左子树的节点均小于x,同时右子树上的节点均大于x。所以用我们的二叉查找树来作为索引确实能提高我们的查询效率。这里需要大家注意的是,我们说的索引的存储块和我们之前所说的数据库最小存储单位块或者页并非一一对应。这是方便我们的理解呢先将其一一对应起来了。每个存储块存储的是关键字还有指向子树的指针,像上图这颗树他不仅是二叉树还是一颗平衡二叉树。那什么是平衡二叉树呢?就是它的任意一个节点的左子树它的高度均不超过1,那这里我们先从根部开始,根部的左子树(如2)和根部的右子树(如7),它的高度要高于1,右子树要高一些。那到达底部呢他的左右子树的高度是一样的7(6,9),总之它的高度是不能超过1的 。

二叉查找树的查找用的是二分查找,比如说我们要搜6,那这里呢6要比5大因此我们就要从右孩子去查找,那么右孩子呢我们又来到了7,这里7又比6大因此这里我们就去查找7的左孩子,这样我们就能定位到6了。

因为是对半搜索所以它的时间复杂度是O(longn)因此,其查询效率是非常高的。但是他也有缺点比如说咱们的数据库可能要面临着增加和删除。

那么这里咱们假定一下,这里我们经过数据的删除之后节点2,6 都被删除了。同时呢我们新增了关键词为11的节点那么根据二叉查找树的特性呢,它会被插入到9的右子树当中,紧接着我们又插入了13根据平衡二叉树的原则我们又要插入到9的右子树当中。那么最终将会演变成下面图。一个线性的二叉树那么它的查询时间复杂度就会演变成O(n)大大降低了查询效率。有的人会说我们就可以利用树的旋转的特性来保持这颗树是平衡二叉树这样其时间复杂度就可以维持在O(longn)就可以了。这样确实解决了第一个问题但是她还会有第二个问题,咱们之前说了影响程序运行速度的瓶颈在哪里?对了就是IO。如果我们假定这些索引块都在磁盘中,拿刚刚的检索来讲去找6,会先发生一次IO,将根的数据读入到我们的内存当中。那么之后呢再发生一次IO将7读进来,接下来再发生一次IO读了6。即检索的深度呢每增加1就会发生一次IO。咱们的平衡二叉树也好红黑树也罢每个节点最多只能够有两个孩子。而咱们的数据块会非常的多,因此为了组织起这些数据块咱们树的深度就会很深很深,IO的次数呢都会很多这样数据一多,跟我们之前所说的全表扫描要慢很多。根本就无法满足我们优化查询的需求了。那咱们还有什么办法即降低时间复杂度又降低IO的次数呢?主要树要树边大一些,每个节点能存储的数据多一些。这时候就要想起我们的B Tree了

们的B Tree了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqh2VOKg-1632114379455)(ms图库/线性二叉树.jpg)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值