今天看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
如果要我们找出一个数组中的最小(最大)的元素,那么第一反应肯定是使用最小(最大)堆。时间复杂度等同于建堆的复杂度,这里是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
最小堆算法: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 using namespace std; 11 12 #def...
分类:
编程语言 时间:
2014-10-29 14:40:51
阅读次数:
247
二叉堆:一般我们拿来用的就是最大堆和最小堆。最小堆:每个节点的值比它的左右子节点的值要大。代码实现如下:参考Mark Allen Weiss《数据结构和算法分析》(第二版) 1 #include 2 #include 3 4 #define MIN (1items =(Item*)ma...
分类:
其他好文 时间:
2014-10-28 23:55:06
阅读次数:
997
堆排序基本思路:根据完全二叉树,建立最大最小堆来排序时间复杂度:O(nlongn)/** * */package com;/** * @author wenb * @time 下午03:52:55 * @date 2014-10-24 */public class HeapSort { pu...
分类:
编程语言 时间:
2014-10-24 18:29:10
阅读次数:
221