C++ STL 中大根堆,小根堆的应用。
1》优先队列:在C++中优先队列默认的是大根堆,如果用小根堆则加入greater.
priority_queue<int, vector<int>, less<int>>s;//less表示按照递减(从大到小)的顺序插入元素
priority_queue<int, vector<int>, greater<int>>s;//greater表示按照递增(从小到大)的顺序插入元素
不写第三个参数或者写成less都是大根堆。greater是小根堆。
2》实际应用中我们借助于数组vector来建堆。
vector<int> a;
make_heap(a.begin(),a.end(), less<int>() );//建立大根堆
make_heap(a.begin(),a.end(), greater<int>() );//建立小根堆
push_heap(a.begin(),a.end());//将最后一个元素插入堆中(堆自动调整)
pop_heap(a.begin(),a.end());//将第一个元素从堆中删去(堆自动调整),并放到最后
3》举例:
/*
【502】给定一个整数数组,如何快速地求出数组中第k小的数。假如数组为:{4,0,1,0,2,3}。
*/
#if 1
int getMin(int* a,int len, int k) {vector<int>V;V.assign(a, a + len);int res;for(int i=0;i<k;i++){make_heap(V.begin(), V.end(), greater<int>());//把greater去掉就变成了小根堆,本题就变成求第k个最大值。pop_heap(V.begin(), V.end());res = V[V.size()-1];V.pop_back();}return res;
}
int main() {int a[6] = { 4,0,1,0,2,3 };cout << getMin(a, 6, 4) << endl;return 0;
}
#endif
第四小的数字是:
其他一些关于堆的函数用法 参照:
其他函数应用
/*
真题496:每20个数组,每个数组有50个元素,并且使有序的,现在如何在这20*500个数组中找出排名前5的数。
*/
#if 0
#define rows 3
#define cols 5
//int num[rows][cols] = { {29,17,14,2,1},{19,17,16,15,6},{30,25,20,14,5} };
int num[rows][cols] = { {1,2,14,17,29},{6,15,16,17,19},{5,14,20,25,30} };
struct Node {int * p;//指向数组的指针,便于取下一个数字bool operator<(const struct Node& node)const {return *p > *node.p;}};
void gettop(int k){struct Node arr[rows];int* res = new int[k];for (int i = 0; i < rows; ++i)arr[i].p = num[i];//初始化指针指向各行的首位//优先队列默认是大堆,这块是自己去设置的大堆。priority_queue<Node>myq(arr, arr + rows);for (int j = 0; j < k && j < cols; ++j) {Node tmp = myq.top();myq.pop();res[j] = *tmp.p;tmp.p++;myq.push(tmp);}for (int i = 0; i < k; ++i) {cout << res[i]<<" ";}cout << endl;
}
int main() {int k = 5;gettop(5);return 0;
}
#endif
C++ STL 中大根堆,小根堆的应用。相关推荐
- 堆——神奇的优先队列 大根堆小根堆详解,附小根堆C++代码实现与STL相关
文章目录 前置知识 堆操作 小根堆插入 代码实现 小根堆删除 代码实现 测试代码 STL实现--priority_queue 1.使用 2.创建 3.成员函数 前置知识 堆是一个完全二叉树(最后一层可 ...
- 哈夫曼编码之大根堆小根堆揭西县
哈夫曼编码 根据数据出现的频率对数据进行编码,从而压缩原始数据. 例如对于一个文本文件,其中各种字符出现的次数如下: a : 10 b : 20 c : 40 d : 80 可以将每种字符转换成二进制 ...
- 二叉堆 | 大根堆 小根堆
目录 何为二叉堆 二叉堆的调整 最大堆 最大堆的插入操作 最大堆的删除操作 最大堆的构建 最大堆code 最小堆 小根堆的插入操作 最小堆的删除操作 最小堆的构建 最小堆code 二叉堆的存储方式 何 ...
- day36: 数据流中的中位数(大根堆小根堆)
问题描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. ...
- 二叉堆------小根堆
二叉堆是完全二叉树,每个结点中存有一个元素. 小根堆堆性质:父亲的权值不大于儿子的权值. 插入操作 插入操作是指向二叉堆中插入一个元素,要保证插入后也是一棵完全二叉树. 最简单的方法就是,最下一层最右 ...
- STL中heap算法(堆算法)
①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template ...
- 大根堆和小根堆的区别
大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...
- 大根堆的删除c语言,大根堆和小根堆的C语言实现
大根堆小根堆的实现:以PPT形式呈现大根堆构建的理论过程 1.首先涉及到一个堆的调整,这也是算法的核心部分.假设树中,节点i的子树已经为两个大根堆.这两个子树再加上i节点的话,可能是大根堆也可能不是, ...
- 堆(大根堆、小根堆)
完全二叉堆 堆又可称之为完全二叉堆.这是一个逻辑上基于完全二叉树.物理上一般基于线性数据结构(如数组.向量.链表等)的一种数据结构. 完全二叉树的存储结构 学习过完全二叉树的同学们都应该了解,完全二叉 ...
最新文章
- chgrp 简明笔记
- 如何在maven环境中设置JVM参数
- 当 TiDB 与 Flink 相结合:高效、易用的实时数仓
- php 随机在文章中添加锚文本_SEO站长布局锚文本时的7大注意事项
- frestadmin多样式响应式后台HTML模板
- 主成分分析(PCA)-最大方差解释
- 解决VMware在Windows 7上无法上网的问题
- CodeProject - 在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)...
- 力扣 二叉搜索树的最小绝对差
- 对话框:创建对话框模板和修改对话框属性
- Python 3 实现选择排序
- python中常用的函数有哪些_python里常用的函数类型
- leetcode Submission Details
- ubuntu中录制gif
- 20120912新工作感想
- 实验四——DPCM编码(1bit、2bit、4bit、8bit量化)
- 固定table第一列
- python爬取公众号文章_python爬取微信公众号历史文章
- Java— 齐头并进完成任务—多线程
- MVC中方便的[Authorize],加上这特性,就可以加上登录验证
热门文章
- 微信小程序电商商城系统怎样搭建?
- HDU, 3579 Hello Kiki
- buildroot编译出错(2020-09-27)
- java gui是什么_Java GUI编程(一)
- python中da_python数据类型一
- word里公式后面标号怎么对齐,Word里面公式后面的编号如何与公式最后一行对齐?...
- 用KUSTO查询语句(KQL)在Azure Data Explorer Database上查询LOG实战
- Java调整图片大小合并PNG图片生成ICON(保持背景透明)
- 不重启显示新增硬盘(虚拟机)
- MACD指标精粹讲解