天冷了,那些树还好吗?

简介: 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree)。 平衡树:对一棵查找树(search tree)进行查询/新增/删除 等动作, 所花的时间与树的高度h 成比例, 并不与树的容量 n 成比例。

二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree)。

平衡树:对一棵查找树(search tree)进行查询/新增/删除 等动作, 所花的时间与树的高度h 成比例, 并不与树的容量 n 成比例。如果可以让树维持矮矮胖胖的好身材, 也就是让h维持在O(lg n)左右, 完成上述工作就很省时间。能够一直维持好身材, 不因新增删除而长歪的搜寻树, 叫做balanced search tree(平衡树)。(摘自百度百科《平衡树》)

AVL树:在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树在节点增删后不再满足AVL树条件,则需要“旋转”以重新构造自身。

红黑树:RB树。每个节点都带有颜色属性的二叉查找树。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

  • 节点是红色或黑色。
  • 根节点是黑色。
  • 每个叶节点(NIL节点,空节点)是黑色的。
  • 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

下图就是一棵红黑树:

AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多;
红黑是弱平衡的,用非严格的平衡来换取增删节点时候旋转次数的降低;
所以简单说,搜索的次数远远大于插入和删除,那么选择AVL树,如果搜索,插入删除次数几乎差不多,应该选择RB树。

可以看到,这三者查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率 。

但是在大规模数据存储中,使用二叉查找树实现索引查询,元素数量是非常大的,这样就 导致二叉查找树结构树的深度过大,进而造成磁盘I/O读写过于频繁,导致查询效率低下,那么如何减少树的深度,一个基本的想法就是:采用多叉树结构。这样我们就提出了一个新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构

B-tree:一种平衡多路搜索树(并不是二叉的)。B-tree树即B树, B即Balanced ,平衡的意思。

B+-tree:B+的搜索与B-树也基本相同,区别是B+树所有关键字都在叶子结点出现,因此只有达到叶子结点才命中(B-树可以在非叶子结点命中)。B+树叶子节点链表中的关键字是有序的,且所有叶子结点都有一个链指针指向下一个叶子节点,这个特性使得B+树对范围查找的效率比B树高的多,比如对已经建立索引的数据库记录,查找10<=id<=20,那么只要通过根节点搜索到id=10的叶节点,之后只要根据叶节点的链表找到第一个大于20的就行了,比B-树在查找10到20内的每一个时每次都从根节点出发查找提高了不少效率。

B*-tree:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3。

Huffman tree:又称最优树。对应的有哈夫曼编码,其主要应用在数据压缩,加密解密等场合。

上述只是常见但很小一部分树,最后附图一幅:

 

参考资料:

数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

B树、B+树与B*树简介

ZIP压缩算法详细分析及解压实例解释

跳表SkipList的原理和实现

目录
相关文章
|
2月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
104 0
|
7月前
|
存储 算法 关系型数据库
【面试普通人VS高手系列】b树和b+树的理解
【面试普通人VS高手系列】b树和b+树的理解
|
存储 关系型数据库 MySQL
令你头疼的[树]
令你头疼的[树]
|
存储 算法 Java
Java数据结构与算法分析(十)B树图文详解(含完整代码)
迄今为止,已经介绍了《 二叉查找树 》和《 AVL树 》,我们始终假设可以把整个数据结构存储在内存中。可是,如果数据多到内存装不下,这就意味着必须把数据放在磁盘上,显然这些数据结构不再适用。 问题在于磁盘的I/O速度是远远不如内存访问速度的,然而从一棵树中查找到某个元素,必须从根节点一层层往下找,这每一次查找便是一次I/O操作。为了提高性能,就必须要减少查找的次数。 如能减少树的高度、增加每个节点中的元素数,便是种有效的解决方案。实现这种想法的一种方法是使用B树。
174 1
|
存储 关系型数据库 MySQL
浅浅谈一谈B树和B+树
浅浅谈一谈B树和B+树
|
存储
认识了树,再来看看二叉树吧
认识了树,再来看看二叉树吧
132 0
认识了树,再来看看二叉树吧
|
存储 机器学习/深度学习 Java
《Java数据结构》这些树和二叉树的性质你还记得吗?
《Java数据结构》这些树和二叉树的性质你还记得吗?
124 0
|
存储 算法
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
|
存储 关系型数据库 MySQL
通俗易懂介绍mysql索引为什么使用B+树?
通俗易懂告诉你mysql索引为什么使用B+树?回答这个问题之前先考虑两个问题: 1.mysql为什么使用索引? 2.支持索引的数据结构都有哪些?
通俗易懂介绍mysql索引为什么使用B+树?