c++用priority_queue实现最小堆,并求解最大的n个数

 1 //c++用priority_queue实现最小堆,并求解很多数中的最大的n个数
 2 #include <iostream>
 3 #include <queue>
 4 #include <time.h>
 5 #include <vector>
 6 using namespace std;
 7 struct Node {
 8     double value;
 9     int idx;
10     Node (double v, int i): value(v), idx(i) {}
11     friend bool operator > (const struct Node &n1, const struct Node &n2) {
12       return n1.value > n2.value;
13     }
14 };
15 int main(){
16 //测试数据
17 vector<double> v;
18 srand((int)time(NULL));
19 for(int i=0;i<100;i++){
20     double tt=rand()%100;
21     cout<<tt<<endl;
22     v.push_back(tt);
23 }
24 cout<<"------------------------im the line-----------------------"<<endl;
25 //新建一个最小堆
26     priority_queue<Node, vector<Node>, greater<Node>> minheap;
27 //首先先建立一个大小为n的堆
28    for (int i=0;i<10;i++){
29       Node Notemp(v[i],i);
30       minheap.push(Notemp);
31     }
32 //后面的都进行比较后再选择是否放入
33    for(int i=10;i<100;i++){
34       //当前的node
35       Node Noteamp(v[i],i);
36      // cout<<Noteamp.value<<endl;
37           if(minheap.top().value<Noteamp.value){
38        //将这个大的数放进去
39        minheap.push(Noteamp);
40        //将堆顶最小的数弹出
41        minheap.pop();
42       }
43       else{
44       continue;
45       }
46     }
47 //输出
48     for(size_t i=0;i<10;i++){
49       cout<<minheap.top().value<<endl;
50       minheap.pop();
51     }
52
53 }
时间: 2024-11-12 16:34:32

c++用priority_queue实现最小堆,并求解最大的n个数的相关文章

STL最小堆

前几天同学参加腾讯实习的网络笔试,闲聊中得知一道编程题目,最近也在看算法,觉得刚好用来练手. 这题觉得以最小堆实现比较方便,在C++中,以<algorithm>中 make_heap(), push_heap(), pop_heap(), sort_heap()四个函数管理堆十分方便. make_heap(RandomIt first, RandomIt last, Compare comp)对 [first, last - 1]中的元素建立最大堆,修改comp可以处理最小堆: push_he

C++ priority_queue 最大堆、最小堆

问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何处理?这时,就可以借助C++ STL的priority_queue. 具体分析 需要注意的是,C++ STL默认的priority_queue是将优先级最大的放在队列最前面,也即是最大堆.那么如何实现最小堆呢? 假设有如下一个struct: struct Node { int value; int idx; Node (int v, int i): value(v), idx

STL -最大最小堆 priority_queue

//添加头文件#include<queue> using namespace std; 最大堆实现: 优先输出大数据 priority_queue<Type, Container, Functional> Type为数据类型, Container为保存数据的容器,Functional为元素比较方式. 如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大. #include<iostream> #

poj 3784 用堆动态求解中位数

堆真是一种简单而又神奇的数据结构,以前用它求过前kth的数,现在又可以用两个堆来动态求解中位数. 算法: 构建一个大顶堆和一个小顶堆,分别记为g和l. 假设当前中位数为mid,新读入一个数为tmp,则: 1.如果tmp < mid,则将tmp插入大顶堆,跳到步骤3. 2.如果tmp >= mid,则将tmp插入小顶堆,跳到步骤4. 3.如果大顶堆的元素个数比小顶堆多2(两个堆个数不平衡),则将mid插入小顶堆,弹出大顶堆堆顶元素为新的mid. 4.与步骤3相反,如果小顶堆的元素个数比大顶堆多2

POJ 3784 Running Median (最大最小堆)

最大最小堆动态求中位数 题意:输入M个数,当已输入的个数为奇数个时输出此时的中位数. 一共有M/2+1个中位数要输出,每一行10个. 分析: 用两个优先队列来模拟最大最小堆.中位数是x,就是有一半数比x小,一半数比x大. 刚好符合堆的特点. 用一个从大到小排序的优先队列q1来模拟小于x的数. 从小到大排序的优先队列q2来模拟大于x的数. 动态维护两个优先队列的元素个数.q1.size()=q2.size() 输入的数为偶数个时, q1.size()=q2.size()+1 输入的数为奇数个时.

初学算法-基于最小堆的优先级队列C++实现

笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出! 在实现优先级队列时,笔者表示萌萌哒没有用过template写派生类,结果写完了出现error: *** was not decleared in this scope..后来各种补上this->才完事,在CSDN(笔者的帖子地址? http://bbs.csdn.net/topics/391806995)上提问后才知道是模板参数依赖,笔者表示涨姿势了.. /**  * The Minimum Heap Class an

Black Box--[优先队列 、最大堆最小堆的应用]

Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are t

hdu 4006 The kth great number (优先队列+STB+最小堆)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6637    Accepted Submission(s): 2671 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

使用最小堆优化Dijkstra算法

OJ5.2很简单,使用priority_queue实现了最小堆竟然都过了OJ……每次遇到relax的问题时都简单粗暴地重新push进一个节点…… 然而正确的实现应该是下面这样的吧,关键在于swap堆中元素时使用pos数组存储改变位置后的编号为k的节点对应在堆中的位置.下面这种实现也很简单,d,v,p均存储在堆中,只有pos指明位置.源代码作者很聪明>_< #include <stdio.h> #define MAXN 1200 #define MAXM 1200000 #defin