實現優先隊列結構主要是經過堆完成,主要有:二叉堆、d堆、左式堆、斜堆、二項堆、斐波那契堆、pairing 堆等。php
徹底二叉樹,根最小。數據結構
存儲時使用層序。svg
插入末尾 26,不斷向上比較,大於26則交換位置,小於則中止。性能
提取末尾元素,放在堆頂,不斷下濾:spa
都是基於insert(上濾)與deleteMin(下濾)的操做。.net
減少元素:減少節點的值,上濾調整堆。blog
增大元素:增長節點的值,下濾調整堆。排序
刪除非頂點節點:直接刪除會出問題。方法:減少元素的值到無窮小,上濾後刪除。遞歸
Merge:insert one by one隊列
徹底d叉樹,根最小。
存儲時使用層序。
操做跟二叉堆基本一致:insert,deleteMin,增大元素,減少元素,刪除非頂元素,merge。
(1) merge :
(1.3).H1根有右孩子
1.初始狀態,H1的根6,H2的根爲8,將H2合併到H1。
2.將H1構形成根無右孩子的形式:
3.將元素10, merge到H2,要首先將H2構形成根無右孩子的形式,遞歸,merge,若出現不知足:零路徑長:左兒子≧右兒子,交換左右孩子……
——》
——》
——》
4.
5.
斜堆合併操做的遞歸合併過程和左偏樹徹底一樣。假設我們要合併 A 和 B兩個斜堆,且 A 的根節點比 B 的根節點小,我們只須要把 A 的根節點做為合併後新斜堆的根節點,並將 A 的右子樹與 B 合併。由於合併都是沿著最右路徑進行的,經過合併之後,新斜堆的最右路徑長度必然增長,這會影響下一次合併的效率。因此合併後,通過交換左右子樹,使整棵樹的最右路徑長度很是小(這是啟發規則)。然而斜堆不記錄節點的距離,在操做時,從下往上,沿著合併的路徑,在每個節點處都交換左右子樹。通過不斷交換左右子樹,斜堆把最右路徑甩向左邊了。
若是是不支持所謂的合併操做union的話,普通的堆數據結構就是一種很理想的數據結構(堆排序)。 可是若是想要支持集合上的合併操做的話,最好是使用二項堆或者是斐波那契堆,普通的堆在union操做上最差的狀況是O(n),可是二項堆和斐波那契堆是O(lgn)。