平衡二叉树

​ 二叉排序树最大的缺点就是无法保证平衡性,若极端情况可能退化成单链表,丧失二叉排序树的优点。因此平衡二叉树就是左子树和右子树的高度差(也叫平衡因子)不超过1。建树的时候要根据条件进行左旋和右旋。

​ 平衡二叉树应用:AVL树(较早出现,调整代价大,windows进程地址空间管理)、红黑树(对比一般平衡树优点是调整较快,一般应用在数据量不大的内存中,java8的HashMap)、B/B+树(很好的适应了磁盘IO的读取特点,所以用于文件系统,数据库)

  • 二叉搜索(排序)树性质:左子树不为空,则所有左子树节点小于根节点值,所有右子树节点大于根节点的值。

  • 平衡二叉树(AVL树):建树时通过左旋右旋操作保证左右子树高度差不超过1,减少二叉搜索树的不稳定性。

  • 红黑树:类平衡树。特点:1、每个节点非红即黑;2、根节点、叶子结点(指的是为nil的节点)是黑色;3、若一个节点是红色,其子节点必为黑色;4、从节点到子孙节点路径包含相同数量的黑节点。时间复杂度O(logn),效率很高。(红黑树关键特性:从根到叶子最长可能路径不多于最短可能路径的2倍,即大致平衡)

    为什么从根到叶子最长可能路径不多于最短可能路径的2倍?因为特点3和4,任何路径黑色节点数量相同,又一红一黑。

    什么时候红色,什么时候黑色?插入时为红色,因为为了不破坏特点4,左旋右旋调整的时候也是为了维护特性,调整时特性3不满足就会置为黑色。

​ 二叉树、二叉搜索树时间复杂度最好O(logn)最差O(n),二叉树最坏情况是所有节点都在一边而退化成链表,平衡树(平衡二叉树、红黑树)解决了这个问题,时间复杂度为O(logn)。

为什么红黑树优于二叉平衡树?因为二叉平衡树要求每个节点子树高度差最多为1,过于严格,导致添加或删除节点时候可能会破坏二叉平衡树的规则,因而要频繁调整(左旋、右旋),在数据量大的情况下效率有较大影响。而红黑树因为自身特点,插入和删除的时候就不会那么容易破坏红黑树规则导致频繁调整。

因为这个原因,红黑树一般使用较多。但查找方面二叉平衡树效率高于红黑树,故红黑树是一种不大严格的平衡树,是一种折中方案。

为什么java8的HashMap链表到红黑树的进化和退化阈值是8和6?

​ 当hashCode离散性(均匀分布)很好的时候,树型bin用到的概率非常小,bin中节点的分布频率会遵循泊松分布,一个bin中链表长度达到8个元素的概率为0.00000006,几乎是不可能事件。这种不可能事件都发生了,说明bin中的节点数很多,查找起来效率不高。至于7,是为了作为缓冲,可以有效防止链表和树频繁转换。(之所以选择8,不是拍拍屁股决定的,而是根据概率统计决定的。由此可见,发展30年的Java每一项改动和优化都是非常严谨和科学的。)

红黑树的平均查找长度是log(n),如果长度为8,平均查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,而log(6)=2.6,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。

B树:多路搜索树(非二叉的),有B-树、B+树、B*树。图解

B类树效率相当于在关键字范围内做二分查找的效率。

  • B-树(不是读B减树,而是B杠树,是第一代树):

所有叶子节点位于同一层。关键字分布在整棵树中,关键字中保存了数据。可能在非叶子节点就命中返回。

​ 2-3树(每个非叶子节点都有2或3个子节点)和2-3-4树是B-树的特例。能让增删改查操作在对数时间完成,与二叉类树不同,他的出现是为了优化大块数据的读写操作,常用于数据库和文件系统上。

  • B+树:

B-树变体,不同的是,非叶子节点关键字只保存关键字不保存数据(只做索引),非叶子结点相当于叶子结点的稀疏索引,而叶子结点才用于储存数据,到达叶子结点才命中(B-树可以在非叶子结点命中)。

​ B+树适合文件索引系统,因为相比B-树他叶子节点没存数据,而是指向关键词的指针,所以空间小,能容纳的关键字就多了,一次IO能查更多数据,就降低了IO次数。叶子节点用双向指针连接,提高区间访问的性能。但他相对B-树元素遍历效率低,更适合于范围的查询,比如mysql建索引,因为数据库基于范围查找操作很频繁。

  • B*树

B+树的变体,在B+树非根和非叶子节点增加指向兄弟的指针,非叶子结点关键字个数至少(2/3)M,而因此B树块利用率提高到2/3(B+树块利用率只有1/2)

B树和红黑树使用场景
  • 数据规模小,可以放在内存,适合用红黑树,效率高。
  • 否则适合用B树,一次可以读入较大量的数据进行查找(不需要多次读)。
  • B+树适合文件索引系统。
posted @ 2021-04-20 20:54  i%2  阅读(68)  评论(0)    收藏  举报