[Algorithm] Heap & Priority queue

這裏只是簡單的瞭解,具體內容詳見推薦的原連接html

注意堆和樹的區別算法

堆就是優先級隊列的實現形式數據結構


 

 

堆排序

排序過程

Ref: 排序算法之堆排序(Heapsort)解析post

  • 第一步(構造初始堆):

{7, 5, 6, 1, 3, 2, 4}已經知足了大根堆,第一步完成性能

  • 第二步(首尾交換,斷尾重構):

  • 第三步(重複第二步,直至全部尾巴都斷下來)

 

堆的介紹

Ref: 數據結構:堆(Heap)ui

 

 

STL的 Heap

Outline

Ref: 隨筆分類 - 數據結構_算法【博主寫得很賣力】url

 

FAQ: Why is the C++ STL priority queue implemented using a binary heap instead of a Fibonacci heap?spa

Fibonacci heap is better than Binary heap just theoretically.htm

Because Binary heap is way faster than the Fibonacci heap.blog

A binary heap is just an array and the methods used are quite simple.

 

 

實現 "優先級隊列" 的堆

二叉堆 

二叉堆是徹底二元樹或者是近似徹底二元樹,它分爲兩種:最大堆和最小堆。 

 

 

堆 (優先級隊列) 的合併 

左傾堆

目的

當優先隊列中涉及到"對兩個優先隊列進行合併"的問題時,二叉堆的效率就沒法使人滿意了,而本文介紹的左傾堆,則能夠很好地解決這類問題。

特色

不滿節點:是指該該節點的左右孩子至少有一個爲NULL。葉節點的NPL爲0,NULL節點的NPL爲-1。

零距離(英文名NPL,即Null Path Length):則是從一個節點到一個"最近的不滿節點"的路徑長度

 

性質

[性質1] 節點的鍵值小於或等於它的左右子節點的鍵值。
[性質2] 節點的左孩子的NPL >= 右孩子的NPL。[故謂之「左傾」]
[性質3] 節點的NPL = 它的右孩子的NPL + 1。

 

斜堆

斜堆是左式堆的自調節形式,左式堆和斜堆的關係相似於伸展樹和AVL樹的關係。

斜堆具備堆序的性質,可是沒有結構的限制,這樣的話一次的操做最壞的狀況時O(n),可是連續m次操做總的複雜度O(mlogn)。 

 

二項堆 

二項樹是一種遞歸定義的有序樹。它的遞歸定義以下:
(01) 二項樹B0只有一個結點;
(02) 二項樹Bk由兩棵二項樹B(k-1)組成的,其中一棵樹是另外一棵樹根的最左孩子。

 

二項堆的性質

[性質一] Bk共有2k個節點。
[性質二] Bk的高度爲k。
[性質三] Bk在深度i處剛好有C(k,i)個節點,其中i=0,1,2,...,k。
[性質四] 根的度數爲k,它大於任何其它節點的度數。

 

斐波那契堆 (Fibonacci heap)

堆中一種,它和二項堆同樣,也是一種可合併堆;可用於實現合併優先隊列。

 

更好的平攤分析性能

斐波那契堆比二項堆具備更好的平攤分析性能,它的合併操做的時間複雜度是O(1)
與二項堆同樣,它也是由一組堆最小有序樹組成,而且是一種可合併堆。
與二項堆不一樣的是,斐波那契堆中的樹不必定是二項樹;並且二項堆中的樹是有序排列的,可是斐波那契堆中的樹都是有根而無序的。 

 

 End.

相關文章
相關標籤/搜索