实现优先队列结构主要是经过堆完成,主要有:二叉堆、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)。