数据结构----树结构

树的查找时间为log(n),n为树的高度,

二叉排序树(二叉查找树、二叉搜索树)

左节点比根节点小,右边比根节点大,并且左右子树都又是二叉排序树

极限条件下,会变成链表,如:
为什么要尽可能保证树的平衡,因为树的查询取决于树的高度,
在这里插入图片描述

平衡树(平衡二叉树)

为了防止二叉排序树极端情况下变成链表,平衡树出现了,在插入的同时调整这颗树,让其节点尽可能均匀的分布。
AVL树:左右子树树高不超过1,和红黑树相比,它是严格的平衡二叉树,适合修改少、查找多的情况,Windows NT内核中广泛存在.
红黑树:就是平衡树的一种,他的规则都是为了更好的保证树的平衡,⾯对频繁地插⼊与删除红⿊树更加合适,红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决。这一点是AVL所不具备的。

红黑树:
每个节点非红即黑.
根节点是黑的。
每个叶节点(叶节点即树尾端NUL指针或NULL节点)都是黑的.
如果一个节点是红的,那么它的两儿子都是黑的.
对于任意节点而言,其到叶子点树NIL指针的每条路径都包含相同数目的黑节点.

B树

定义:一种多路搜索树,它的每个节点可以拥有多于两个孩子节点。
场景
B/B+树为了磁盘或其它存储设备而设计的
1、做文件系统的索引,----------------文件系统和数据库的索引都是存到硬盘上的,并且数据量大,不一定能一次性加载到内存中,如果一颗树都无法一次性加载到内存中,要怎么查找呢?这时候B树的多路存储就起作用了,可以每次加载B树的一个节点,然后一步步往下找。
如:假设内存一次性只能加载2个数,这么长的内存无法一次性加载进内存,把它组织成一颗三路的B树,这样每个节点最多有2个数,查找的时候每次载入内存一个节点就行;
如果在内存中,红黑树比B树效率更高,但是涉及到磁盘操作, B树就更优了

B/B+树上操作的时间通常由存取磁盘的时间和CPU计算时间这两部分构成,
而CPU的速度非常快,所以B树的操作效率取决于访问磁盘的次数,
关键字总数相同的情况下B树的高度越小,磁盘I/O所花的时间越少.

为什么要设计成多路呢?要降低树的高度,路数越多,树的高度越低,但是不能设计成无限多路,这样就会变成有序数组,即Python的数组,

优点:B 树中每个节点同时存储 key 和 data,因此经常访问的元素可能离根节点更近,访问也更迅速。

插入实现思路:对高度为h的m阶B树,新结点一般是插在第h层(即最底层)。通过检索可以确定关键码应插入的结点位置。然后分两种情况讨论:

1、 若该结点中关键码个数小于m-1,则直接插入即可。

2、 若该结点中关键码个数等于m-1,则将引起结点的分裂。以中间关键码为界将结点一分为二,产生一个新结点,并把中间关键码插入到父结点(h-1层)中

重复上述工作,最坏情况一直分裂到根结点,建立一个新的根结点,整个B树增加一层。

一棵5阶B树(树中最多含有m(m=5)个孩子,因此关键字数最小为ceil(m/ 2)-1=2。还是这句话,关键字数小了(小于2个)就合并,大了(超过4个)就分裂)为例

———————————————— 版权声明:本文为CSDN博主「yang_yulei」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yang_yulei/article/details/26104921

B+树

定义:B+树是在B数的基础上改造的,它的数据都在叶子结点上,同时叶子结点之间还加了指针形成链表

B+ 树中只有叶⼦节点才存储 data,⾮叶⼦节点只存储 key,InnoDB 对 B+ 树进⾏了优化,在每个叶⼦节点上增加了⼀个指向相邻叶⼦节点的链表指针,形成了带有顺序指针的 B+ 树,提⾼区间访问的性能。

场景数据库索引
应文件系统所需而产生的,文件的目录一级一级索引,只有最底层的叶子节点(文件)保存数据
数据库select数据,会选很多条,B树需要做局部的中序遍历,可能要跨层访问,而B+树所有数据都在叶子结点上,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能将数据取出来

既然hash比B+树更快,为啥不用hash
1、这和业务场景有关,如果只选一条数据hash是更快,但是数据库经常需要选择多条数据,这个时候B+树索引有序,并且又有链表相连,它的查询效率就比hash快很多了;
2、而且数据库的索引一般在磁盘上,数据量大的情况下无法一次性装入内存,B+数允许数据分批加载,同时数的高度较低,提高了查询效率

优点·: ① ⾮叶⼦节点上不含数据信息,因此在内存⻚中能够存放更多的key,数据存放得更加紧密,具有更好的空间利⽤率,访问叶⼦节点上关联的数据也具有更好的缓存命中率。
② 整棵树的遍历只需要遍历所有叶⼦节点。

数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。在实际实现中B-Tree在每次新建节点时,直接申请一个页的空间,

转载链接:https://blog.csdn.net/qq_29373285/article/details/88610654

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值