STL heap usage】的更多相关文章

简介 heap有查找时间复杂度O(1),查找.插入.删除时间复杂度为O(logN)的特性,STL中heap相关的操作如下: make_heap() push_heap() pop_heap() sort_heap() reverse() 本次着重介绍make_heap() ,根据其创出的堆有大小堆之分. 其函数原型如下: default (1) template <class RandomAccessIterator> void make_heap (RandomAccessIterator…
STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个幕后英雄,扮演priority queue的助手.顾名思义,priority queue允许用户以任何次序将任何元素推入容器内,但取出时一定是从优先权最高(也就是数值最高)的元素开始取.binary max heap 正是具有这样的特性,适合作为priority queue 的底层机制. 让我们做一…
一.heap 在STL中,priority_queue(优先权队列)的底层机制是最大堆,因此有必要先来了解一下heap.heap采用完全二叉树的结构,当然不是真正的binary tree,因为对于完全二叉树,我们通常用一个数组来表示. 以下几个算法都是STL的泛型算法,包含在头文件algorithm里,priority_queue的push(),pop()都有直接调用它们. 1.push_heap算法 首先,将新元素插入到底层vector的end()处.为了满足最大堆原理(每个结点的值必须大于或…
STL的堆操作 STL里面的堆操作一般用到的只有4个:make_heap();.pop_heap();.push_heap();.sort_heap(); 他们的头文件函数是#include <algorithm> 首先是make_heap(); 函数原型是:void make_heap(first_pointer,end_pointer,compare_function); 一个参数是数组或向量的头指针,第二个向量是尾指针.第三个参数是比较函数的名字.在缺省的时候,默认是大跟堆.(下面的参数…
题意: 给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列, 让你求出序列和最小的前n个序列的序列和. 解题思路: 1.将第一序列读入seq1向量中,并按升序排序. 2.将数据读入seq2向量中,并按升序排序. 将seq2[0] +seq1[i] ( 0<=i<=n-1)读入seqn向量中 用make_heap对seqn建堆. 然后seq2[1] + seq1[i] (0<=i<=n-1),如果seq2[1] +seq1[i]比堆seqn的顶点大,…
heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个幕后英雄,扮演priority queue的助手.顾名思义,priority queue允许用户以任何次序将任何元素推入容器内,但取出时一定是从优先权最高(也就是数值最高)的元素开始取.binary max heap 正是具有这样的特性,适合作为priority queue 的底层机制. 让我们做一点分析.如果使用list 作为pr…
“堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queue,也就是STL的优先队列来实现堆的,然而最近我发现了一个新的STL容器,它相对优先队列有着更小的常数和更方便的操作. 它就是heap,就是堆. 关于heap,STL提供了4个函数,它们都定义于algorithm库中.它们分别是: 建立堆: make_heap(_First, _Last, _Cmp…
本文假设你已对堆排序的算法有主要的了解. 要分析stl中heap的源代码的独到之处.最好的办法就是拿普通的代码进行比較.话不多说,先看一段普通的堆排序的代码: //调整大顶堆.使得结构合理 void max_heap(int a[],int node,int size) { int lg=node; int l=node*2; int r=node*2+1; if(l<=size&&a[lg]<a[l]) { lg=l; } if(r<=size&&a[l…
1.定义 堆:若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树 树中任一非叶子结点的关键字均不大于(或不小于)其子结点的关键字.分为大根数(默认)和小根树(自定义cmp) 高度:堆可以被看成是一棵树,结点在堆中的高度可以被定义为从本结点到叶子结点的最长简单下降路径上边的数目:定义堆的高度为树根的高度.我们将看到,堆结构上的一些基本操作的运行时间至多是与树的高度成正比,为O(lgn). 摘取:http://blog.csdn.net/blad…
#include <iostream>#include <algorithm>#include <vector> using namespace std; int main(){ vector<int> vec1; vector<int>::iterator vec_iter1; for (int k=0;k<10;k++) { vec1.push_back(rand()); } for (vec_iter1 = vec1.begin();…