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 first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
  void make_heap (RandomAccessIterator first, RandomAccessIterator last,
                  Compare comp );

  

  函数解释如下:

  

  Make heap from range

  Rearranges the elements in the range [first,last) in such a way that they form a heap.

  A heap is a way to organize the elements of a range that allows for fast retrieval of the element with the highest value at any moment (with pop_heap), even repeatedly, while allowing for fast insertion of new elements (with         push_heap).

  The element with the highest value is always pointed by first. The order of the other elements depends on the particular implementation, but it is consistent throughout all heap-related functions of this header.

  The elements are compared using operator< (for the first version), or comp (for the second): The element with the highest value is an element for which this would return false when compared to every other element in the range.

  The standard container adaptorpriority_queue callsmake_heap,push_heap andpop_heap automatically to maintain heap properties for a container.

  Parameters

  first, last
Random-access iterators to the initial and final positions of the sequence to be transformed into a heap. The range used is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.
RandomAccessIterator shall point to a type for whichswap is properly defined and which is both move-constructible and move-assignable.
  comp
Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to be less than the second in the specific strict weak ordering it defines.
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.
基本上可以概括为默认的参数原型创建最大堆,带有comp仿函数参数的原型可以根据comp的选取创建所需的堆,根据后面的实例可得,默认的比较符是小于号,创建最大堆; 若comp的比较操作为“ >” 则创建最小堆。

实例

  1.创建最大堆(默认函数)

// range heap example
#include <iostream>     // std::cout
#include <algorithm>    // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap
#include <vector>       // std::vector

int main () {
  int myints[] = {10,20,30,5,15};
  std::vector<int> v(myints,myints+5);

  std::make_heap (v.begin(),v.end());
  std::cout << "initial max heap   : " << v.front() << ‘\n‘;

  std::pop_heap (v.begin(),v.end()); v.pop_back();
  std::cout << "max heap after pop : " << v.front() << ‘\n‘;

  v.push_back(99); std::push_heap (v.begin(),v.end());
  std::cout << "max heap after push: " << v.front() << ‘\n‘;

  std::sort_heap (v.begin(),v.end());

  std::cout << "final sorted range :";
  for (unsigned i=0; i<v.size(); i++)
    std::cout << ‘ ‘ << v[i];

  std::cout << ‘\n‘;

  return 0;
}

输出:

initial max heap   : 30
max heap after pop : 20
max heap after push: 99
final sorted range : 5 10 15 20 99

可得最大堆。

  2.最小堆创建(使用custom(2)函数)

#include <iostream>
#include <vector>
#include <algorithm>

struct doc {
    double rank;
    explicit doc(double r) : rank(r) {}
};

struct doc_rank_greater_than {
    bool operator()(doc const& a, doc const& b) const {
        return a.rank > b.rank;
    }
};

int main() {
    std::vector<doc> docvec;
    docvec.push_back( doc(4) );
    docvec.push_back( doc(3) );
    docvec.push_back( doc(2) );
    docvec.push_back( doc(1) );
    std::make_heap(docvec.begin(),docvec.end(),doc_rank_greater_than());
    std::cout << docvec.front().rank << ‘\n‘;
}

输出:

1

可得最小堆。

总结  自定义函数可以根据容器中的对象创建相应的最大最小堆。

时间: 2024-10-09 22:39:52

STL heap usage的相关文章

STL heap和first_queue(未完结)

STL heap和first_queue 标签(空格分隔): @zhshh STL heap first_queue 可以看看这个文章 大家都知道,priority_queue是用堆实现的,可以通过重载()运算符选择使用最大堆或最小堆.以前一直觉得stl里面的heap相关的函数都是多余的,因为一般的heap操作都可以用priority_queue来做.直到今天看了July博客中的那道求前k小的数(http://blog.csdn.net/v_JULY_v/article/details/6370

STL -- heap结构及算法

STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个幕后英雄,扮演priority queue的助手.顾名思义,priority queue允许用户以任何次序将任何元素推入容器内,但取出时一定是从优先权最高(也就是数值最高)的元素开始取.binary max heap 正是具有这样的特性,适合作为priority queue 的底层机制. 让我们做一

SSSP dijstra+stl::heap 邻接表模版

//SSSP dijstra+stl::heap 邻接表模版 #include<bits/stdc++.h> using namespace std; #define why 105 #define whym 1455 #define inf 0x3f3f3f3f int n,m,d[why],h[why],cnt,s,t; bool v[why]; struct node { int next,to,v; }a[whym*2]; struct tap { int num,v; bool op

【算法学习】老算法,新姿势,STL——Heap

"堆"是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queue,也就是STL的优先队列来实现堆的,然而最近我发现了一个新的STL容器,它相对优先队列有着更小的常数和更方便的操作. 它就是heap,就是堆. 关于heap,STL提供了4个函数,它们都定义于algorithm库中.它们分别是: 与sort一样,其中_First,_Last都是头,尾指针

STL heap部分源代码分析

本文假设你已对堆排序的算法有主要的了解. 要分析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

POJ 2442 Squence (STL heap)

题意: 给你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的顶点大,

STL heap部分源码分析

本文假设你已对堆排序的算法有基本的了解. 要分析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[lg

STL~heap

1.定义 堆:若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树 树中任一非叶子结点的关键字均不大于(或不小于)其子结点的关键字.分为大根数(默认)和小根树(自定义cmp) 高度:堆可以被看成是一棵树,结点在堆中的高度可以被定义为从本结点到叶子结点的最长简单下降路径上边的数目:定义堆的高度为树根的高度.我们将看到,堆结构上的一些基本操作的运行时间至多是与树的高度成正比,为O(lgn). 摘取:http://blog.csdn.net/blad

STL之priority_queue为复合结构排序

priority_queue为复合结构排序: 1 #include <iostream> 2 #include <queue> 3 4 using namespace std; 5 struct Node{ 6 int x; 7 string y; 8 Node( int a= 0, string b = "" ): 9 x(a), y(b) {} 10 }; 11 bool operator<( Node a, Node b ){ // 注意这里的顺序和