Back to Posts

数据结构—23树

Posted in dataStruct

AVL的完美导致负荷太大

继上一篇对AVL树中的总结;AVL是完美平衡树,对于性能开销太大,因为每次插入删除元素,一是都要递归往上一层记录平衡因子,二是一旦平衡因子绝对值大于一,都要进行旋转;
其实这么完美是没有必要的,当一颗树达到很深的层级以后如此完美的平衡造成根节点很频繁的修改自身平衡因子和主动选装;

一生二二生三 三生万物 2-3树

于是有人提出了23树,23树的性质先不说,其主旨就是为了减轻根结点的压力,如果插入的元素再插入的节点上自己能使自己平衡的话,就不需要递归交给上一层直至根结点处理了;
但是如果要在AVL树的基础上,在每个节点插入时保持自治平衡是不可能的;所谓一生二二生三 三生万物,只有节点产生变异——能有三个子节点,就能保证基本的平衡。(为啥是三节点,从次幂的角度来说,到第N层的时候,没增加一个次幂就能多容纳很多个元素了,所以不要小看多出来的这一个节点)

对于有三个子节点的父节点来说,它会有两个键,左子节点大于起左键,中子节点大于左键小于右键,右子节点大于右键;

插入元素

  • 一个元素X,如果插入到2-节点上,那么还好说,直接将2-转为3-节点即可:之前我以为的是如果2-的节点缺少子节点,会将x作为其子节点,但是这么一来会增加局部的高度……
  • 一个元素X,如果插入到3-节点上,需要将3-节点临时转为4-节点;然后4-节点中的中键提升到其父节点所在位置;如果父节点因此变为了4-节点,那么递归往上处理

以上两点,体现了节点的局部独立自治平衡,不用每次都要像AVL那样由根节点来旋转实现平衡;

但是23树不是标准的二叉树,对于AVL中的put、delete、和旋转都不适用了;
牛逼的前人们,想出了红黑二叉树表示23树,保证了局部子树的平衡自治,又能使用AVL树中的方法。

你看那个人好像一条狗啊

Read Next

wait、notify——生产者消费者