深入分析 BTree、B+Tree、AVL树、红黑树

所谓的查找过程:在一个Key Set中查找指定key的过程,为什么慢,主要原因是因为Key Set中的Key太多了
什么是冲突?
不同的key,经过hash函数之后,得到了相同的hash值
为什么会冲突?
因为KeySet中的 key的数量远远大于数组长度,一般不会让数组长度变大,有太多的空间浪费了
hash表如何提高查找效率?
数组中,根据下标访问元素的时间复杂度为O(1)
负载因子=key的size/数组的length,前面的不动,只能改变数组的length
负载因子越大冲突越大,负载因子越小扩容频繁

一、 AVL树 – 典型的平衡二叉搜索树

  • AVL树的特点
  • 它的左 树和右子树都是AVL树
  • 左子树和右子树的高度差不能超过1uu
  • 在删除、插入的时候需要维护树的平衡性,代价可能过大,但是查找的速度很快

二、红黑树 – 近似平衡的二叉搜索树

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

三、红黑树和AVL树的区别

读取,查找 维护,旋转 空间开销
AVL树
红黑树 没AVL快 和AVL类似
  • AVL适用于插入与删除次数比较少,但查找多的情况;如果搜索、插入、删除次数几乎差不多选择红黑树
  • 真正的区别在于在任何添加/删除操作时完成的旋转操作次数,平衡AVL树可能需要O(Logn)旋转,而一棵红色黑树最多需要3次旋转就使其达到平衡

B树和B+树的出现是因为另外一个问题,那就是磁盘IO;平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。 为了减少磁盘IO的次数,就必须降低树的深度,将“瘦高”的树变得“矮胖”。每个节点存储多个元素,摒弃二叉树结构,采用多叉树
B树的查询主要在内存中,平衡二叉树在磁盘中进行查询

四、B-树(B树)– 有序数组+平衡多叉搜索树

树的高度越低代表需要I/O的次数越少,B-树是一棵多叉平衡搜索树,旨在比AVL树能够拥有更低的树高,提高查找的效率,但是同AVL树一样,面对插入和删除数据的操作后需要维持平衡,这可能带来一些得不偿失的情况。其次B-树可以被采用在外存的数据查询上,因为树高度比较低,这样就可以减少磁盘的I/O次数。

  • B树的优点
  • 每个节点至少有俩个子女
  • 对于在内部节点的数据,可直接得到,不必根据叶子节点来定位
  • B树所有节点都带有指向记录的指针,但是所有叶子节点没有通过指针连接在一起。

五、B+树– 有序数组链表+平衡多叉搜索树

B+树是B树的变种,有着比B树更高的查询效率

  • B+树的优点
  • 首先B+树的数据全部存储在叶子结点,中间的结点只是存储键值key,不存储数据,那么也就是在相同的磁盘块的大小的情况下,我们可以存储更多的索引,这样也可以减少磁盘的I/O次数,降低树的高度。
  • 只有叶子节点会带有指向记录的指针,然后在树的叶子结点间进行了一个链接的操作,即叶子节点之间通过指针来连接,这是便于我们进行范围查找,因为在B-树中进行范围查找将是十分困难的,需要采用中序遍历,在叶子节点和内部节点不停的往返移动。

六、B和B+树的区别

  • B+树中只有叶子节点会带有指向记录的指针,而且所有叶子节点都是通过指针连接在一起。而B树所有节点都带有向记录的指针,所有叶子节点没有通过指针连接在一起。B树在内部节点出现的索引项不会再出现在叶子节点中,B+树会出现。

  • B+树相比B树的优势:

  • 单一节点存储更多的元素,使得查询的IO次数更少;

  • 所有查询都要查找到叶子节点,查询性能稳定;

  • 所有叶子节点形成有序链表,便于范围查询;

  • 对于范围查找,B+树通过二分查找找到下限,然后顺着叶子结点的链表找到上限;B树依赖中序遍历,二分查找找到上限,在中序遍历找到范围的下限

深入分析 BTree、B+Tree、AVL树、红黑树_第1张图片

7、 树家族的全部对比

  • 平衡二叉查找树(AVL)运用于搜索,结构简单,节点维护方便,深度较深,适用于内存
  • B树结构层级较低,搜索次数低于二叉树,运用于磁盘搜索,结构复杂,维护成本高
  • 红黑树,相比二叉树,结构稍复杂,层次更低,插入,修改,删除更快,统计性能相比AVL低,适用于内存
    参考一
    参考二

你可能感兴趣的:(数据结构)