這裏只是簡單的瞭解,具體內容詳見推薦的原連接html
注意堆和樹的區別算法
堆就是優先級隊列的實現形式數據結構
Ref: 排序算法之堆排序(Heapsort)解析post
{7, 5, 6, 1, 3, 2, 4}已經知足了大根堆,第一步完成性能
Ref: 數據結構:堆(Heap)ui
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,它大於任何其它節點的度數。
堆中一種,它和二項堆同樣,也是一種可合併堆;可用於實現合併優先隊列。
斐波那契堆比二項堆具備更好的平攤分析性能,它的合併操做的時間複雜度是O(1)。
與二項堆同樣,它也是由一組堆最小有序樹組成,而且是一種可合併堆。
與二項堆不一樣的是,斐波那契堆中的樹不必定是二項樹;並且二項堆中的樹是有序排列的,可是斐波那契堆中的樹都是有根而無序的。
End.