非旋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], 然后把排列中\(<pos[n]\)和\(>pos[n]\)的弄出去繼續遞歸。
由於我們是random_shuffle(pos[])的,相當於pos[n]的值是我們隨機出來的,所以這個問題等價於快速排序算法。
而快排算法遞歸深度是\(O(\log n)\) 的。回到原問題我們就證明FHQ Treap的深度是期望\(O(\log n)\)的。
而關於這個算法在各種特定構造數據下的表現,顯然和快排算法的表現是等價的。
是不是感覺FHQ Treap突然一下子沒有那么玄乎了?