Fhq-Treap
首先我们从二叉搜索树讲起(顺便复习)
我们知道我们访问一个节点所需要的时间复杂度和他的深度有直接的关系,比如说一个N个节点的完全二叉树访问一个节点的最坏复杂度是 O(logN) O ( l o g N ) ,但是如果在一条N个节点的链中访问一个节点的最坏复杂度就是 O(N) O ( N ) ,所以想要速度够快,那么树的结构一定要尽量平衡,保持在 logN l o g N 左右。
为了使一个树平衡,人们找到了很多方式,譬如说splay,他通过不断旋转的方式使得树一直保持在一个比较平衡的状态。
但是总是在不断旋转真的好麻烦啊(雾
那么有没有不需要旋转的平衡树呢??有那就是fhq神犇的fhq-treap
首先我们得知道什么是Treap
Treap=Binary Search Tree+Heap(二叉搜索树+堆)
也就是说他的整体结构满足二叉搜索树的性质,然而他的每一个节点有一个随机取的附加的关键词,他们满足堆的性质。
那么他是依靠什么维护平衡性的呢?对就是靠的附加权值,因为附加权值是随机取的,每一个权值取到的概率都是相同的,那么他的期望高度就是 logN l o g N 也就是说他大概就是平衡的。
然而一般的treap也要通过旋转保持平衡,但是fhq-treap不需要,这得益于他的两个神奇的核心操作 Merg