在此引用黃前輩的**素材:
優先佇列(priority queue)是一種抽象資料型別(adt),它是一種容器,裡面有一些元素,這些元素也稱為佇列中的節點(node)。優先佇列的節點至少要包含一種性質:有序性,也就是說任意兩個節點可以比較大小。為了具體起見我們假設這些節點中都包含乙個鍵值(key),節點的大小通過比較它們的鍵值而定。優先佇列有三個基本的操作:插入節點(insert),取得最小節點(minimum) 和刪除最小節點(delete-min)。
左偏樹,一種可以合併的堆狀結構,支援插入,變換,合併 等操作。穩定的時間複雜度在θ(logn) 的級別。對於乙個左偏樹中的節點,需要維護的值有dist 和value 。其中value 不必多說,dist 記錄這個節點到它子樹裡面最近的葉子節點的距離,葉子節點距離為0。
左偏樹一般儲存以下幾個節點資訊,這裡先寫出來,方便之後的講述。(具體實現時還是要根據題目需求來儲存資訊,這裡給出幾個基本的)
\[log_2(n+1)−1≥k
\]將時間複雜度穩定在乙個log,其主要思想就是不斷把新的堆合併到新的根節點的右子樹中——因為我們的右子樹決定「距離」這個變數,而距離又一定保證在log的複雜度內,所以不斷向右子樹合併。
大體思路(以小根堆為例),首先我們假設兩個節點x和y,x的根節點的權值小於等於y的根節點(否則swap(x,y)),把x的根節點作為新樹z的根節點,剩下的事就是合併x的右子樹和y了。
合併了x的右子樹和y之後,x當x的右子樹的距離大於x的左子樹的距離時,為了維護性質二,我們要交換x的右子樹和左子樹。順便維護性質三,所以直接\(dist_x\)=\(dist_+1\).
struct tree
//f()表示father,d()表示距離,l(),r(),表示左右子
}
左偏樹(可並堆)
左偏樹其實是一種可並堆,它可以 o log2 n o l og2n 合併兩個堆。那左偏?也就是說他左邊肯定有什麼東西比右邊大 別著急,在左偏樹上有乙個叫距離的東西 個點的距離,被定義為它子樹中離他最近的外節點到這個節點的距離 這與樹的深度不同 其中我們定義乙個節點為外節點,當且僅當這個節點的左子樹和...
可並堆 左偏樹
題目描述 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 ...
可並堆 左偏樹 斜堆
經典的二叉堆已經可以在 o log n 的複雜度的情況下維護堆這樣的資料結構,也有d 堆可以維護成 o log d n 雖然pop操作的複雜度是 o d log d n 然而這兩種堆不能滿足 o log n 的合併操作,它們的經常是 o n log n 即每次將乙個堆中的堆頂拿出來放到另乙個堆裡。雖...