左偏樹學習筆記

2021-10-24 19:57:16 字數 1175 閱讀 8295

左偏樹是一種基於二叉樹的可並堆。

定義乙個節點的「距離」 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(

log⁡si

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(

log⁡si

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 我們不難發現...