非旋FHQ Treap复杂度证明(类比快排)
a,b都是sort之后的排列(从小到大)
由一个排列a构造一颗BST,由于我们只确定了中序遍历=a,但这显然是不能确定一棵树的形态的。
由一个排列b构造一颗Heap(大根),由于没有重复元素,然后人为钦定左儿子<右儿子,那么他的后序遍历=b。
但是一棵树,如果中序遍历和后续遍历确定了,那么他的形态也就确定了。证明考虑构造一种由中序和后序遍历的序列还原一颗确定的树的算法。
考虑对于一个后序遍历,最后那个数\(u\)一定是根。
- 那么确定\(u\)在中序遍历中的位置x,可以发现在x左边的都是左子树,右边的都是右子树。而x自己是根。
- 根据左右子树的情况把左右子树的后序遍历按顺序抠出来
由于我们得到了左右两颗子树的中序后序遍历,就划分成子问题了。由于每次我们都确定了一个子树的根,那么整棵树都是确定的。
考虑这棵树的深度是多少,不难发现上述算法递归多少层那么树的深度就是多少。
由于中序遍历a是出题人随意构造的。所以我们只能改变后序遍历。
后序遍历是一个排列b[],排列中每个数有一个对应在中序遍历的位置pos[i],其中a[pos[i]]=b[i],我们random_shuffle(b[])就相当于random_shuffle(pos[])。
现在有一个随机排列pos[],考虑我们的算法就变成了 : 选择最后的那个位置上的值pos[n], 然后把排列中\(
由于我们是random_shuffle(pos[])的,相当于pos[n]的值是我们随机出来的,所以这个问题等价于快速排序算法。
而快排算法递归深度是\(O(\log n)\) 的。回到原问题我们就证明FHQ Treap的深度是期望\(O(\log n)\)的。
而关于这个算法在各种特定构造数据下的表现,显然和快排算法的表现是等价的。
是不是感觉FHQ Treap突然一下子没有那么玄乎了?