左偏樹是一種基於二叉樹的可並堆。
定義乙個節點的「距離」 dis
xdis_x
disx
為它到空節點的最短路長度,左偏樹強制要求 dis
lson
≥dis
rson
dis_\ge dis_
dislso
n≥d
isrs
on,所以 dis
x=di
srso
n+
1dis_x=dis_+1
disx=
disr
son
+1。可以證明,dis
x=o(
logsi
ze
)dis_x=o(\log size)
disx=
o(logsiz
e),其中 siz
esize
size
為子樹 x
xx 的大小。
左偏樹的基本操作為合併操作 mer
ge(x
,y
)merge(x,y)
merge(
x,y)
,表示合併子樹 x
xx 與 y
yy 所代表的堆。mer
ge
merge
merg
e 的大體流程是,先選擇值更大的節點作為根(如果是大根堆),然後將 x
xx 與 rso
n[y]
rson[y]
rson[y
] 合併,再檢查是否滿足左偏性質,不滿足則交換左右子樹。
因此,mer
ge
merge
merg
e 操作的複雜度是 o(d
isx+
disy
)=o(
logsi
ze
)o(dis_x+dis_y)=o(\log size)
o(disx
+di
sy)
=o(logsi
ze),其中 siz
esize
size
為合併後的堆的大小。
插入操作:可以看做將乙個葉子與一棵樹合併。
刪除最大元素操作:將兩顆子樹合併,並刪除根節點。
理論上好像也可以魔改在上面打懶標記?
左偏樹 學習筆記
首先要知道左偏樹是用來幹什麼的。如果給我們兩個優先序列,然後讓我把這兩個優先佇列合併成乙個優先佇列。如果直接用堆,就是將乙個佇列裡面的數不斷彈出然後扔到另乙個佇列裡。複雜度是 o n n為佇列中數的個數。但是用左偏樹就可以做到 log n 1 n 2 ps 為了便於討論,本文所有的左偏樹均已小根樹為...
學習筆記 左偏樹
左偏樹是一種可並堆,除了堆的基本功能,最大的特點就是支援合併堆,甚至比普通堆好寫。下面敘述以小根堆為例,大根堆對稱。o log n 求乙個數所在堆的根 o 1 求最小值 o log n 合併兩個堆 o log n 刪除最小值 o log n 插入乙個數 n 是插入的總節點數 或當前堆的節點數 str...
左偏樹 學習筆記
左偏樹是可並堆的一種。除了支援堆的所有操作之外,左偏樹還支援合併兩個堆並把複雜度維持在 o n log n 級別。dist 外節點 對於一棵二叉樹,我們定義外節點為左兒子或右兒子為空的節點。dist 我們定義某乙個節點的 text 為該點到最近的外節點的距離。外節點的 text 為 1 我們不難發現...