博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

树的进化史

Posted on 2023-03-10 14:29  池塘鱼  阅读(148)  评论(0编辑  收藏  举报

二叉树——>二叉搜索树——>平衡二叉树——>B树——>B+树

 概念:

  • 二叉树:每个结点最多有两个子结点的树。
  • 二叉搜索树(二叉排序树):每一个结点都满足“左结点小于当前结点,右结点大于等于当前结点”的二叉树。
  • 平衡二叉树:要么是一颗空树,要么保证其中随意一个结点都满足“左右子树的高度差不大于1”的二叉搜索树。
  • 红黑树:是一种大致的平衡二叉树,不完全满足平衡二叉树,因为它舍弃了平衡二叉树追求的完全平衡,而在大致平衡的基础上保证每次插入结点后达到平衡最多需要旋转3次。
  • B树(B-树):多路搜索树,相对二叉搜索树来说,子结点数量大于2,但满足左中右的有序。
  • B+树:同样是多路搜索树,相比于B树,它的所有数据结点全部在叶结点,且叶结点之间通过指针形成有序链表,同时中间结点不存放数据只存放键。
  • PS:B树全称Balance-树,因此B是平衡的意思,横杠也不是减号的意思。

产生原因:

  • 二叉树——>二叉搜索树:二叉树搜索树是为了提升查找效率而生,一颗合格的二叉搜索树,它的中序遍历结果一定是从小到大有序排列的,这使得在查找数据时相当于使用二分查找,在大多数情况下时间复杂度从O(n)升级到O(logn),但是最坏的情况,当数据有序插入时,就会退化为链表,时间复杂度退化为O(n)。
  • 二叉搜索树——>平衡二叉树:为了解决上述有序插入时退化为链表的情况,使结点分布尽可能均匀,出现了平衡二叉树。平衡二叉树通过每次数据都变更都进行多次旋转操作来保持子树之间的高度差。此时插入、删除、查询的时间复杂度都是O(n)。但是当数据量大的时候,平衡二叉树因子节点的数量限制深度log2n就会很大,从而导致查询效率降低。
  • 平衡二叉树——>红黑树:解决最坏情况下为了保证树的平衡性需要旋转太多次的情况,保证最坏的情况下都是高效的。
  • 平衡二叉树——>B树:为了解决数据量大时平衡二叉树的深度问题,B树通过允许子结点数量放开来实现树高的限制,一颗M路(每个结点最多有M个子结点)B树的深度为logmn。路数越多,高度越低。但是路数也不能无限制大,否则会退化成有序数组。但是B树不利于一个区间内多个数据的查询,查完一个数字后查其他数字可能还需要跨层查询。
  • B树——>B+树:B+树解决了查找一段有序区间的效率问题,通过给存放了所有数据的叶结点之间的指针连接,可以很便利地找到其前后的数据,只需要找到首尾数据就可以找到其区间的多个数据。同时,因为所有数据都存放在叶结点,B+树的查询时间复杂度稳定在O(logmn),查询更为稳定。

应用场景:

  • B树:大量单个key查询的场景,比如随机搜索,可以考虑B树。
  • B+树:存在大量范围查询的场景,适合使用B+树,比如数据库。实际应用中操作系统的文件索引和数据库索引也更适合B+树,因为B+树的内部结点不存放数据,一个结点就比较小,磁盘IO操作是以页为单位的,同样的页空间就可以存档更多的数据,一次IO就可以获取更多数据。

 

参考:

 【通俗易懂的图文 红黑树,B树,B+树 本质区别及应用场景】