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) ...
随机推荐
- HttpWebRequest 基础连接已经关闭: 接收时发生错误 GetRequestStream 因为算法不同,客户端和服务器无法通信。
在代码行 HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(sUrl 前面加上 ServicePointManager ...
- DIV+CSS网页布局常用的一些基础知识
CSS命名规范 一.文件命名规范 全局样式:global.css:框架布局:layout.css:字体样式:font.css:链接样式:link.css:打印样式:print.css: 二.常用类/I ...
- C++ vector操作--往列表中添加或更新内容
有个列表,往里面添加内容,如果对象已存在,只更新其属性,否则添加新一项. #include <iostream> #include <string> #include < ...
- PHP Catchable fatal error: Argument 2 passed to Illuminate\Routing\UrlGenerator::__construct()
laravel 项目的根目录下 运行composer update之后,报了包含 PHP Catchable fatal error: Argument 2 passed to Illuminate\ ...
- PyQt6的在线安装与环境配置
https://www.jianshu.com/p/185e277e0058 一,安装好Python,Pycharm 二,安装或更新pip C:\> python -m pip install ...
- yii2.0 数据库查询操作
User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User:: ...
- jupyter|魔法函数问题| UsageError: Line magic function `%` not found
问题: jupyter notebook 使用魔法函数% matplotlib inline,报错:UsageError: Line magic function `%` not found 解决: ...
- Windows start
启动一个单独的窗口以运行指定的程序或命令. START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] ...
- day19 装饰器
Python之路,Day7 = Python基础7 randomwrapper 包装材料:包装纸:书皮global a 全局的(也就是,函数最外面的那个)nonlocal a 局部的,上层的函数的变量 ...
- docker中国区镜像加速
[root@syzyy ~]# vim /etc/docker/daemon.json { "registry-mirros":[ "https://registry.d ...