STL 最大堆与最小堆
在第一场CCCC选拔赛上,有一关于系统调度的水题。利用优先队列很容易AC。
// 由于比赛时花费了不少时间研究如何定义priority_queue的比较函数,决心把STL熟练掌握...
Queue
首先来看http://www.cplusplus.com/reference/queue/queue/对STL Queue容器的介绍。
在C++中只要#include<queue>可使用队列类,常用的成员函数有
1. push
2. pop
3. size
4. empty
5. front
6. back // 目前还没使用过,留意一下
队列在BFS时经常使用,已经比较熟悉其用法。
Priority_queue
在CPP网站上同样也有优先队列的详细介绍。在《数据结构与算法分析》一书上,堆(heap)等同于优先队列,或者准确地说,优先队列是通过堆实现的。
相比队列,priority_queue的成员函数名基本一致,除了将front改为top,都是获取队首元素。
1. push
2. pop
3. size
4. empty
5. top
一般情况下使用方式与vector,queue一样,需要自定义数据类型时稍有点不同了。
priority_queue<int, vector<int>, greater<int> > q; // 小顶堆
priority_queue<int, vector<int>, less<int> > q; // 大顶堆,默认 // 自定义数据结构
// 方式一
struct Node{
int x, y;
Node(int a = , int b= ):x(a), y(b) {}
}; struct cmp{
bool operator() (const Node& a, const Node& b ){
if (a.x == b.x)
return a.y > b.y;
return a.x > b.x;
}
}; priority_queue<Node, vector<Node>, cmp> q; // 方式二
struct Node{
int x, y;
Node(int a = , int b= ):x(a), y(b) {}
}; bool operator < (const Node& a, const Node& b ){
if (a.x == b.x)
return a.y > b.y;
return a.x > b.x;
}
上次比赛时,我忘了如何加上vector<int>部分,摸索半天通过方式二(编写的友元函数实现)才成功调试好代码,浪费了大量的时间。希望以后能记牢,平常多加练习达到熟练运用的水平^_^
STL 堆操作
// 参考COPY自https://blog.csdn.net/my_lovely_lemon_tree/article/details/78007316
头文件是#include <algorithm>
一般用到这四个:make_heap()、pop_heap()、push_heap()、sort_heap();
(1)make_heap()构造堆
void make_heap(first_pointer,end_pointer,compare_function);
默认比较函数是(<),即最大堆。
函数的作用是将[begin,end)内的元素处理成堆的结构
(2)push_heap()添加元素到堆
void push_heap(first_pointer,end_pointer,compare_function);
新添加一个元素在末尾,然后重新调整堆序。该算法必须是在一个已经满足堆序的条件下。
先在vector的末尾添加元素,再调用push_heap
(3)pop_heap()从堆中移出元素
void pop_heap(first_pointer,end_pointer,compare_function);
把堆顶元素取出来,放到了数组或者是vector的末尾。
要取走,则可以使用底部容器(vector)提供的pop_back()函数。
先调用pop_heap再从vector中pop_back元素
(4)sort_heap()对整个堆排序
排序之后的元素就不再是一个合法的堆了。
STL 最大堆与最小堆的更多相关文章
- C++ multiset通过greater、less指定排序方式,实现最大堆、最小堆功能
STL中的set和multiset基于红黑树实现,默认排序为从小到大. 定义三个multiset实例,进行测试: multiset<int, greater<int>> gre ...
- c++/java/python priority_que实现最大堆和最小堆
#include<iostream>#include<vector>#include<math.h>#include<string>#include&l ...
- Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java
Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个h ...
- PAT-1147(Heaps)最大堆和最小堆的判断+构建树
Heaps PAT-1147 #include<iostream> #include<cstring> #include<string> #include<a ...
- -Xmx 和 –Xms 设置最大堆和最小堆
C:\Java\jre1.6.0\bin\javaw.exe 按照上面所说的,最后参数在eclipse.ini中可以写成这个样子: -vmargs -Xms128M -Xmx512M ...
- HDUOJ----4006The kth great number(最小堆...)
The kth great number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Oth ...
- Python3实现最小堆建堆算法
今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...
- java最大最小堆
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...
- 最大堆 最小堆 解决TOPK问题
堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点:最小堆的父节点值均小于子节点: 一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值: 节点i的父节点为(i-1) ...
随机推荐
- Victor and String HDU - 5421 双向回文树
题意: 有n种操作,开始给你一个空串,给你4中操作 1 c 在字符串的首部添加字符c 2 c 在字符串的尾部添加字符c 3 询问字符中的本质不同的回文串的个数 4 询问字符串中回文串的个数 思路 ...
- EFCore学习记录笔记
1:连接slqlocaldb数据库 (1)在CMD下可以输入sqllocaldb info 查看本机安装的所有的localdb实例 (2)数据库连接字符串为:“Server=(localdb)\\MS ...
- Soci介绍
soci是一个用C++封装的数据库访问库,目前通过 “前端(应用程序)/核心/后端(数据库适配)”模式支持firebird,mysql,sqlite3,oracle,postgresql,odbc多种 ...
- Pod 私有仓库构建
Pod 私有仓库构建 创建`私有仓库索引库`(iOS) 添加`私有仓库索引库`到本地repo管理 创建自己的`组建库工程 上传`组建库工程`到`私有仓库索引库` App工程调用`组建库工程` 目的 私 ...
- swing 托盘
直接上方法, 不过有些问题要注意,最后会说明! private void systemTray() { if (SystemTray.isSupported()) { // 判断系统是否支持托盘功能. ...
- ASP.NET网站要手机自适应页面
本文转载的地址:http://mobile.51cto.com/ahot-409516.htm 一. 允许网页宽度自动调整: "自适应网页设计"到底是怎么做到的? 其实并不难. 首 ...
- 关于Qt5(1)-- 两个窗口互相切换的例子
<QT Creator快速入门>这本书有一章介绍model和modeless的概念时,用到了两个窗口互相切换的例子.但是原文对该例子的说明非常模糊不清,现整理如下. 1,要求:登陆界面.主 ...
- day27 模块:正则re, configparser, subprocess
Python之路,Day15 = Python基础15 re 模块补充 ret = re.findall("c.d", "abc\nd", re.S) # 后面 ...
- poj 1742 Coins(二进制优化多重背包)
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...
- day20_函数的闭包 与 装饰器
#!/usr/bin/env python # -*- coding:utf-8 -*- # # 一些文章 # https://www.cnblogs.com/Vae1242/p/6944338.ht ...