这里只是简单的了解,具体内容详见推荐的原连接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.