Libevent中的timeout事件是使用最小堆来管理维护的.代码位于.看函数命名和代码风格应该是一个C++程序员,函数名都挺好懂的,只是下面这个结构体变量命名比较坑....typedef struct min_heap{ struct event** p; unsigned n, a...
分类:
其他好文 时间:
2014-11-18 00:17:50
阅读次数:
239
注:本节主要讨论最大堆(最小堆同理)。
一、堆的概念
堆,又称二叉堆。同二叉查找树一样,堆也有两个性质,即结构性和堆序性。
1、结构性质:
堆是一棵被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树(complete binary tree)。下图就是这样一个例子。
对于完全二叉树,有这样一些...
分类:
其他好文 时间:
2014-11-07 13:08:12
阅读次数:
266
今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构的时候有个堆排序算法,所以顺便研究了一下“堆”结构(这里特指二叉堆)。概念所谓二叉堆(binary ...
分类:
编程语言 时间:
2014-11-06 19:40:59
阅读次数:
470
/**
* 文件名:BinaryHeap.java
* 时间:2014年11月3日下午7:15:34
* 作者:修维康
*/
package chapter6;
import java.util.*;
/**
* 类名:BinaryHeap 说明:建立一个最小堆
*/
class MinHeap> {
private int currentSize;
private stati...
分类:
编程语言 时间:
2014-11-04 17:24:55
阅读次数:
189
一 堆 堆给人的感觉是一个二叉树,但是其本质是一种数组对象,因为对堆进行操作的时候将堆视为一颗完全二叉树,树种每个节点与数组中的存放该节点值的那个元素对应。所以堆又称为二叉堆,堆与完全二叉树的对应关系如下图所示:二叉堆可以分为两种形式:最大堆和最小堆。在这两种堆中,结点的值都要满足堆的性质。在最大堆...
分类:
编程语言 时间:
2014-11-02 20:51:42
阅读次数:
244
栈区:主要用来存放局部变量,传递参数,存放函数的返回地址。.esp始终指向栈顶,栈中的数据越多, esp的值越小。堆区:用于存放动态分配的对象,当你使用malloc和new等进行分配时,所得到的空间就在堆中。动态分配得到的内存区域附带有分配信息,所以你能够free和delete它们。数据区:全局,静...
分类:
移动开发 时间:
2014-11-01 17:29:43
阅读次数:
295
如果要我们找出一个数组中的最小(最大)的元素,那么第一反应肯定是使用最小(最大)堆。时间复杂度等同于建堆的复杂度,这里是O(N)。如果要我们找出一个数组中的第k个最小的元素,那么我们依然可以使用最小堆,删除掉k次的最小值,就得到了结果。复杂度是O(N + klogN)。如果要我们找出一个数组的中值,...
分类:
编程语言 时间:
2014-10-31 15:18:15
阅读次数:
248
在线求第k个数做得多了,在线求中位数也是用堆,一个最大堆,一个最小堆。思想大概是这样子的:一个最大堆,一个最小堆,最大堆对应于前n/(n+1)个数,最小堆对应于后n/n+1个数;假设最大堆堆项元素为n1, 最小堆堆顶为n2, 则n1 s2, 那么:如果m >= n1, m插入到最小堆,s2=s2+....
分类:
其他好文 时间:
2014-10-30 16:46:15
阅读次数:
198
堆排序,就是利用二叉堆的特性来完成排序的工作。这里假定我们要完成对一个数组进行从小到大排序的工作,那么利用最小堆(见《二叉堆 - 最小堆》)的特性,对于一个已经建好的最小堆,我们每次以DeleteMin函数取出最小的元素,放入一个临时数组中,如此一来,就完成了对该数组的排序。时间复杂度的话,建立堆的...
分类:
编程语言 时间:
2014-10-29 18:42:11
阅读次数:
164
与上篇《二叉堆 - 最小堆》类似,只不过堆序(heap order)从内部节点小于左右子节点变成了内部节点大于左右子节点。代码如下: 1 #include 2 #include 3 4 #define MIN (1items =(Item*)malloc((maxItems+1)*si...
分类:
其他好文 时间:
2014-10-29 16:32:17
阅读次数:
270