堆的定义
堆(heap),这里所说的堆是数据结构中的堆,而不是内存模型中的堆。堆通常是一个可以被看做一棵树。
常见的堆有二叉堆、左倾堆、斜堆、二项堆、斐波那契堆等等。
性质:
[性质一] 堆中任意节点的值总是不大于(不小于)其子节点的值;
[性质二] 堆总是一棵完全树。
二叉堆的定义:二叉堆是完全二元树或者是近似完全二元树,它分为两种:最大堆和最小堆。
将任意节点不小于其子节点的堆叫做最大堆或大根堆。
最大堆:父结点的键值总是大于或等于任何一个子节点的键值;
将任意节点不大于其子节点的堆叫做最小堆或小根堆
最小堆:父结点的键值总是小于或等于任何一个子节点的键值。
左倾堆:
它和二叉堆一样,都是优先队列实现方式。当优先队列中涉及到"对两个优先队列进行合并"的问题时,二叉堆的效率就无法令人满意了,
而左倾堆,则可以很好地解决这类问题。
斜堆:
二项堆:
二项堆是二项树的集合。在了解二项堆之前,先对二项树进行介绍。
二项树是一种递归定义的有序树。它的递归定义如下:
(1) 二项树B0只有一个结点;
(2) 二项树Bk由两棵二项树B(k-1)组成的,其中一棵树是另一棵树根的最左孩子。
斐波那契堆:
它和二项堆一样,也是一种可合并堆;可用于实现合并优先队列。斐波那契堆比二项堆具有更好的平摊分析性能,它的合并操作的时间复杂度是O(1)。
与二项堆一样,它也是由一组堆最小有序树组成,并且是一种可合并堆。
与二项堆不同的是,斐波那契堆中的树不一定是二项树;而且二项堆中的树是有序排列的,但是斐波那契堆中的树都是有根而无序的。