【数据结构-树论】平衡树
引入
观看例题。
对于普通的 BST,在输入有序数列时树会退化为一条链
定义及思想
一种平衡树是 Treap,使用了左旋和右旋来保证深度不会过大,原理是在存入每个数时附加一个随机权值并使权值在树上也保持有序。
其通过旋转来保持深度,期望深度是 \(\log n\)。
但是我们有更好的方法:红黑树(Red-BlueBlack Tree)。
红黑树对于每个节点进行了涂色,以保证更优秀的深度。其涂色规则为:
- 节点只能是红色或黑色;
- 必须使根节点为黑色;
- 必须使子节点(这里的子节点指红黑树的 NULL 空叶子节点)为黑色;
- 红节点的孩子必须是黑节点;
- 从根节点到 NULL 空叶子节点的每条路径上都具有相同个数的黑节点。
红黑树仍通过旋转来保持树的深度。
闲话
红黑树是由德国计算机科学家 Rudolf Bayer 在 1972 年从 B 树上改进过来的。
所以是红色和黑色的吗?(?)
一个完整的红黑树不经过压行大概是 \(600\sim 700\) 行。但是没有关系,我们有高贵的 set
。
set
的一个扩展结构是 multiset
,即 “多重 set
”,多重 set
允许相同的数据存在。
但是我们可以看到 multiset
仍然无法解决这道题的问题:他无法给出排名。
作为高贵的 c++ 玩家,此刻我们拿出了最后的武器:pbds。
作用及实现
Splay
引入
观看例题,