[Algorithm] Heap & Priority queue

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

注意堆和树的区别算法

堆就是优先级队列的实现形式数据结构


 

 

堆排序

排序过程

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

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

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

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

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

 

堆的介绍

Ref: 数据结构:堆(Heap)ui

 

 

STL的 Heap

Outline

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,它大于任何其它节点的度数。

 

斐波那契堆 (Fibonacci heap)

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

 

更好的平摊分析性能

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

 

 End.

相关文章
相关标签/搜索