这里只是简单的了解,具体内容详见推荐的原链接

注意堆和树的区别

堆就是优先级队列的实现形式


堆排序

排序过程

Ref: 排序算法之堆排序(Heapsort)解析

  • 第一步(构造初始堆):

[Algorithm] Heap & Priority queue-LMLPHP

{7, 5, 6, 1, 3, 2, 4}已经满足了大根堆,第一步完成

  • 第二步(首尾交换,断尾重构):

[Algorithm] Heap & Priority queue-LMLPHP

  • 第三步(重复第二步,直至所有尾巴都断下来)

堆的介绍

Ref: 数据结构:堆(Heap)

STL的 Heap

Outline

Ref: 随笔分类 - 数据结构_算法【博主写得很卖力】

FAQ: Why is the C++ STL priority queue implemented using a binary heap instead of a Fibonacci heap?

Fibonacci heap is better than Binary heap just theoretically.

Because Binary heap is way faster than the Fibonacci heap.

A binary heap is just an array and the methods used are quite simple.

实现 "优先级队列" 的堆

二叉堆

二叉堆是完全二元树或者是近似完全二元树,它分为两种:最大堆和最小堆。

堆 (优先级队列) 的合并

左倾堆

目的

当优先队列中涉及到"对两个优先队列进行合并"的问题时,二叉堆的效率就无法令人满意了,而本文介绍的左倾堆,则可以很好地解决这类问题。

特点

不满节点:是指该该节点的左右孩子至少有一个为NULL。叶节点的NPL为0,NULL节点的NPL为-1。

零距离(英文名NPL,即Null Path Length):则是从一个节点到一个"最近的不满节点"的路径长度

性质

[Algorithm] Heap & Priority queue-LMLPHP

[性质1] 节点的键值小于或等于它的左右子节点的键值。
[性质2] 节点的左孩子的NPL >= 右孩子的NPL。[故谓之“左倾”]
[性质3] 节点的NPL = 它的右孩子的NPL + 1。

斜堆

斜堆是左式堆的自调节形式,左式堆和斜堆的关系类似于伸展树和AVL树的关系。

斜堆具有堆序的性质,但是没有结构的限制,这样的话一次的操作最坏的情况时O(n),但是连续m次操作总的复杂度O(mlogn)。

二项堆

二项树是一种递归定义的有序树。它的递归定义如下:
(01) 二项树B只有一个结点;
(02) 二项树B由两棵二项树B组成的,其中一棵树是另一棵树根的最左孩子。

[Algorithm] Heap & Priority queue-LMLPHP

二项堆的性质

[性质一] B共有2个节点。
[性质二] B的高度为k。
[性质三] B在深度i处恰好有C个节点,其中i=0,1,2,...,k。
[性质四] 根的度数为k,它大于任何其它节点的度数。

斐波那契堆 (Fibonacci heap)

堆中一种,它和二项堆一样,也是一种可合并堆;可用于实现合并优先队列。

[Algorithm] Heap & Priority queue-LMLPHP

更好的平摊分析性能

斐波那契堆比二项堆具有更好的平摊分析性能,它的合并操作的时间复杂度是O(1)。
与二项堆一样,它也是由一组堆最小有序树组成,并且是一种可合并堆。
与二项堆不同的是,斐波那契堆中的树不一定是二项树;而且二项堆中的树是有序排列的,但是斐波那契堆中的树都是有根而无序的。

End.

05-22 08:51