【ACM】數據結構與算法之左偏樹

左偏樹的定義
  • 左偏樹(Leftist Tree)是一種可並堆(Mergeable Heap) ,它除了支持優先隊列的三個基本操作(插入,刪除,取最小節點),還支持一個很特殊的操作——合併操作。

  • 左偏樹是一棵堆有序(Heap Ordered)二叉樹。

  • 左偏樹滿足左偏性質(Leftist Property)。

左偏樹的定義 —— 左偏性質
  • 定義一棵左偏樹中的外節點(External Node) 爲左子樹或右子樹爲空的節點。

  • 定義節點 i 的距離(dist(i)) 爲節點 i 到它的後代中,最近的外節點所經過的邊數。

  • 任意節點的左子節點的距離不小於右子節點的距離(左偏性質)。

由左偏性質可知,一個節點的距離等於以該節點爲根的子樹最右路徑的長度。

左偏樹的性質

定理:若一棵左偏樹有N個節點,則該左偏樹的距離不超過 ⎣log(N+1)⎦ -1。

在這裏插入圖片描述

左偏樹的操作
  • MakeNull —— 初始化一棵空的左偏樹
  • Merge —— 合併兩棵左偏樹
  • Insert —— 插入一個新節點
  • Min —— 取得最小節點
  • DeleteMin —— 刪除最小節點
  • Delete —— 刪除任意已知節點
  • Decrease —— 減小一個節點的鍵值
左偏樹的操作 —— 合併

合併操作是遞歸進行的。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

Function Merge(A, B)
	If A = NULL Then return B
	If B = NULL Then return A
	If key(B) < key(A) Then swap(A, B)
	right(A) ← Merge(right(A), B)
	If dist(right(A)) > dist(left(A)) Then
		swap(left(A), right(A))
	If right(A) = NULL Then dist(A) ← 0
	Else dist(A) ← dist(right(A)) + 1
	return A
End Function

下面是一個合併的例子:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
合併操作都是一直沿着兩棵左偏樹的最右路徑進行的。

一棵N個節點的左偏樹,最右路徑上最多有 ⎣log(N+1)⎦ 個節點。

因此,合併操作的時間複雜度爲:
O(log N1 + log N2) = O(log N)

左偏樹的操作 —— 插入

插入一個新節點

  • 把待插入節點作爲一棵單節點左偏樹
  • 合併兩棵左偏樹
  • 時間複雜度:O(log N)
左偏樹的操作 —— 刪除

刪除最小節點

  • 刪除根節點
  • 合併左右子樹
  • 時間複雜度:O(log N)
總結

左偏樹的特點:

  • 時空效率高
  • 編程複雜度低

左偏樹的應用:

  • 可並堆
  • 優先隊列
參考

國家集訓隊2005年論文:左偏樹的特點及其應用(廣東省中山市第一中學 黃源河)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章