前几天在做Kth Largest Element in an Array 时使用到了堆,通过那倒题目也了解到了堆的make_heap,push_heap,pop_heap操作,看了C++ reference中的讲解也明白了heap_sort是什么回事。于是想着自己实现以下这四个函数。
堆的定义:
任意节点小于它的所有后裔,最小元在堆的根上(堆序性)。
堆总是一棵完全树。
#include <ios...
分类:
其他好文 时间:
2015-07-14 18:16:02
阅读次数:
109
堆的定义堆是一个完全二叉树或者近似的完全二叉树堆的性质
父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。
每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。堆的存储一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2
堆的特点插入元素和弹出堆顶元素的时间复杂度lg(n)
判断序列是不是堆根据性质判...
分类:
其他好文 时间:
2015-07-13 22:28:39
阅读次数:
130
主要内容:1、什么是堆?2、如何建堆3、堆排序4、参考代码一、什么是堆?“堆”是个很有趣的数据结构,是个完全二叉树。“堆”的特性:每个节点的键值一定总是大于(或小于)它的父节点(大于:称为“最大堆”,小于:称为“最小堆”),或者说每个节点总是大于或小于它的子节点。对于最大堆而言,根节点为最大值;对于...
分类:
编程语言 时间:
2015-07-01 13:40:31
阅读次数:
161
堆排序算法是建立在堆这种数据结构的基础上,其实堆听着很高端,其实很简单,就是一个二叉树,但是又特殊条件,就是其父节点比孩子节点都大(或都小)的堆称为最大堆(最小堆),瞬间感觉很简单了,最简单的保存方法就是直接用数组来保存。
给出一组数,我们要使用堆排序,首先需要建堆,但是这一组数首先肯定是不满足上面堆的性质的,所以我们需要调整,让他满足堆得性质,变成一个堆,怎么调整呢?拿最大堆来说,就是对于一个节...
分类:
编程语言 时间:
2015-06-22 22:21:57
阅读次数:
203
03-树1. List Leaves (25)Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.Input Specification:Each inpu...
分类:
其他好文 时间:
2015-06-21 07:10:18
阅读次数:
305
为什么优先队列里默认是堆(heap)实现,默认是优先级高的出队,定义结构体重载函数为什么要按照从小到大排序?原来是自己对优先队列还不太了解:
1 堆
1.1 简介
n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
(1)ki=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子
若...
分类:
其他好文 时间:
2015-06-20 17:06:28
阅读次数:
124
编写程序判断以下给出的整数序列是否为最小堆。Description第一行是元素的个数n;第二行是n个整数序列。Input如果是小根堆,输出Yes,否者输出No。Output123 10100 86 48 73 35 39 42 57 66 2...
分类:
其他好文 时间:
2015-06-15 23:34:44
阅读次数:
595
golang默认定时器是通过time模块实现的,不管是golang,libev,libevent的定时器都是通过最小堆实现的,通过最小堆实现的定时器加入定时器时间复杂度为O(lgn),在需要大量定时器时效率较低,所以Linux提供了基于时间轮的实现,我们本次提供的定时器实现就是标准的Linux时间轮实现方式。当然,我是把Skynet(https://github.com/cloudwu/skyne...
分类:
其他好文 时间:
2015-05-31 20:13:33
阅读次数:
240
堆排序就是利用了最大堆(或最小堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字变得简单。以最大堆为例,它的基本思想就是:先将初始文件R[1..n]建成一个最大堆,此堆为初始的无序区;再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得...
分类:
编程语言 时间:
2015-05-28 00:10:17
阅读次数:
177