堆实际上是一颗二叉树,对于大根堆来说,它的特点就是父节点的值大于所有子节点的值。 C++的STL中priority_queue已经帮我们实现好了堆的数据结构,接下来我们一起学习并实践如何实现一个堆并用堆进行排序。priority_queue是STL的queue这个头文件中定义的数据结构,因此需要额外 ...
分类:
编程语言 时间:
2016-06-10 19:00:51
阅读次数:
173
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值。...
分类:
编程语言 时间:
2016-05-23 19:15:07
阅读次数:
225
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 分析 平面图求最小割,转化成对偶图求最短路,经典. 注意: 1.优先队列是个大根堆. 2.Dijkstra可以带一个vis数组,也可以不带,因为一个点出来以后,它更新的的点和原本就在队列里 ...
分类:
其他好文 时间:
2016-05-13 23:03:09
阅读次数:
242
前言
在整理算法题的时候发现,大根堆(小根堆)这种数据结构在各类算法中应用比较广泛,典型的堆排序,以及利用大小根堆这种数据结构来找出一个解决问题的算法最优解。因此,我打算单独将关于堆的应用独立总结出来,后面每遇到一种跟堆结构相关的应用都放到这个目录下。
堆的定义
n个关键字序列L[1…n]称为堆,当且仅当该序列满足:
1. L(i)<=L(2i)且L(i)<=L(2i+1)或...
分类:
编程语言 时间:
2016-05-10 12:55:56
阅读次数:
670
注意:使用小根堆排序后是递减数组,要得到递增数组,可以使用大根堆。 在堆排序好后再添加元素,需要重新建堆并且排序。 由于每次重新恢复堆的时间复杂度为O(logN),共N - 1次重新恢复堆操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN)。二次操作时间相加还是O(N ...
分类:
编程语言 时间:
2016-04-23 11:45:07
阅读次数:
173
本章堆排序内容是《算法导论》教材第二部分《排序与顺序统计量》的第一讲。
堆排序,这是一种O(nlgn)时间的原址排序算法。它使用了一种被称为堆的数据结构,堆还可以用来实现优先级队列。
1、堆的概念
数组R[1...n]中,n个关键字序列k1,k2,…,kn,当且仅当该序列满足如下性质(简称为堆性质,以大根堆为例):
ki >= k(2i)且ki >...
分类:
编程语言 时间:
2016-04-01 18:31:48
阅读次数:
281
主要是priority_queue的用法 一个是内置类型优先队列怎么设置小根堆(默认大根堆) 如果是自定义数据结构,有两种办法 1、定义这种数据结构的比较符号,就可以当成内置类型整 2、传进去一个重载()的类,当小于号用,默认还是大根堆,也许传进去的是个callable object都行的吧,我试了
分类:
系统相关 时间:
2016-02-21 22:46:16
阅读次数:
419
看着百度文库学习了一个。 总的来说,左偏树这个可并堆满足 堆的性质 和 左偏 性质。 bzoj2809: [Apio2012]dispatching 把每个忍者先放到节点上,然后从下往上合并,假设到了这个点 总值 大于 预算,那么我们把这个 大根堆 的堆顶弹掉就好了,剩下的就是可合并堆。 感谢pre
分类:
其他好文 时间:
2016-02-06 01:50:27
阅读次数:
565
堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。举例来说,对于n个元素的序列{R0, R1, ... , Rn}当且仅当满足下列关系之一时,称之为堆: (1) Ri = R2i+1 ...
分类:
编程语言 时间:
2016-01-22 18:01:43
阅读次数:
243
堆:大根堆与小根堆 堆排序是建立在堆基础上的排序方法,首先了解一下什么是堆。 常用的堆一般有两种,大根堆和小根堆。堆可以看做是一棵二叉树,其父节点的值总是大于(大根堆)或者小于(小根堆)子节点的值。举一个例子: 图1 不满足堆的条件 图2大根堆...
分类:
编程语言 时间:
2016-01-18 22:18:59
阅读次数:
273