之前写过 Splay 的介绍。那么接下来就是对于 fhq_treap 的介绍了。
相比于 Splay,fhq_treap 要简单一些(个人认为),同时代码量也小一些。
0. 引子
dalao云:“treap,tree+heap 也。”
treap 是一个同时具有 tree(即BST)和 heap 的特点的平衡树。
具体地说,我们会对每个节点随机一个 key 值,然后要求这棵 BST 要对 key 值同时满足堆的性质。也就是说,treap 是笛卡尔树的一种。
通过随机的 key 值,我们可以某种程度上随机确定树的形态,从而使树尽量平衡。
传统的 treap 是靠旋转来确定树的形态。但是 fhq_treap 则大大不同。它的核心操作为 split 和 merge。