当前位置: 首页 > news >正文

C++ 适配器 priority_queue(优先级队列)

在了解优先级队列之前,我们要知道它其实就是堆。

数据结构堆讲解

数据结构——堆-CSDN博客大家可以看这一篇我写的博客来详细了解堆的结构、用途、实现。

priority_queue的相关函数

适配器的函数都少,基本上都是这几个。

构造函数

我总结下来就是可以用迭代器构造,可以用拷贝构造,可以用右值引用,可以用其他容器的数据进行构造。并可以和用迭代器和容器的引用它们一起的值进行构造,这个可以给大家举个例子理解一下


其他函数

这些函数都是很常见的,结合上面的例子我们就可以理解。

priority_queue的实现

建堆快慢的问题

在实现之前,我还要再问一下大家一个重要的问题。我们建堆是每push一次后进行向上调整算法快一些,还是我们一次性把所有数据都拷贝过来用log(N)次向上调整算法快一些,还是我们同样一次性拷贝,但是用向下调整算法快一些?

我们首先来分析一下push一个向上调整一个的算法,那么会调整N次,每次向上调整是logN次,那么就是N*logN的时间复杂度。其他两中我在数据结构——堆-CSDN博客里面讲过,这里如果大家懒得去跳转找我CV一下:

向上调整建堆时间复杂度
这里我们现直接看最后一行,DEFG。如果扩展到N,那么最后一行就是N/2个数据,并且最后一行的向上调整时间复杂度刚好是logN,所以最后一行所有建好堆就是N/2*logN的时间复杂度了,那么已经是N*logN的量级了。我们再看前面的数据,因为度为0的节点等于度为2的节点加一,并且前面的向上调整是小雨logN的,所以前面的加起来是总体小于N/2*logN的,总体就小于N*logN。但又大于N/2*logN。所以时间复杂度就是N*log(N)。

向下调整建堆时间复杂度
这里我们就可以直接看出优势了,直接把最后一排N/2的数据全部略过了,只要操作N/2次向下调整算法就行了。

我用草稿纸把过程写一下:

可能化简的系数等有问题,但是我们算的是级数有哪些,最终最大级数就是N,那么时间复杂度就是O(N)。

那么加上入N个数据的时间复杂度就还是N,所以我们采用一次性把所有数据都拷贝过来用log(N)次向下调整算法快一些

代码实现

#pragma once
#include<utility>
#include<algorithm>
#include<vector>
namespace dgj {template <class T,class container=std::vector<T>,class compare =std::less<T>>class priority_queue {public:priority_queue() {}template <class aliterator>priority_queue(aliterator begin,aliterator end,compare pare=compare(), container& x = container()):_con(x),_pare(pare){_con.insert(_con.end(), begin, end);make_heap();}bool empty() {return _con.empty();}T& top() {return _con.front();}void pop() {std::swap(_con.front(), _con.back());_con.pop_back();heap_ajust_down(0);}void push(const T& val) {_con.push_back(val);heap_ajust_up( size() - 1);}size_t size() {return _con.size();}private:void heap_ajust_up(int pos) {int child = pos, parent = (child - 1) / 2;while (child > 0) {if (_pare(_con[parent], _con[child])) {std::swap(_con[parent], _con[child]);;child = parent;parent = (child - 1) / 2;}else break;}}void heap_ajust_down(int pos) {int parent = pos, child = parent * 2 + 1;while (child < _con.size()) {if (child + 1 < _con.size() && _pare(_con[child], _con[child + 1]))++child;if (_pare(_con[parent], _con[child])) {std::swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else break;}}void make_heap() {for (int x = (_con.size() - 2) / 2; x >= 0; --x)heap_ajust_down(x);}container _con;compare _pare;};
}

检测

可以用以上的代码进行检测看是否有问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Aiseesoft Mac Video Converter Ultimate:高效多能的视频转换与编辑工具
  • 【教程】Leetcode 必知必会常用函数(C 语言版)
  • C# 时间日期运算
  • HarmonyOS NEXT 地图服务中‘我的位置’功能全解析
  • 基于机器学习的二手房房价数据分析与价格预测模型
  • 上传PDF、DOC文件到SAP HCM系统中案例
  • CSS文本样式(二)
  • Day16_Zookeeper
  • (152)时序收敛--->(02)时序收敛二
  • sql主从表的区分
  • 盘古信息IMS MCM制造协同管理系统:为中小企业数字化转型量身打造的数字化方案
  • Axure设计之下拉单选框教程(中继器)
  • 数据库不停机迁移方案
  • 【计算机组成原理】2.2.3_2 无符号数的加减运算
  • 制造业企业如何选择适合自己的MES系统
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Flannel解读
  • Java 多线程编程之:notify 和 wait 用法
  • jQuery(一)
  • php的插入排序,通过双层for循环
  • WePY 在小程序性能调优上做出的探究
  • 力扣(LeetCode)22
  • 怎么把视频里的音乐提取出来
  • ​【已解决】npm install​卡主不动的情况
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)svelte 教程:hello world
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (七)glDrawArry绘制
  • (源码分析)springsecurity认证授权
  • (转) ns2/nam与nam实现相关的文件
  • (转载)深入super,看Python如何解决钻石继承难题
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET和.COM和.CN域名区别
  • .NET企业级应用架构设计系列之结尾篇
  • /var/lib/dpkg/lock 锁定问题
  • @Autowired注解的实现原理
  • @FeignClient注解,fallback和fallbackFactory
  • @vue-office/excel 解决移动端预览excel文件触发软键盘
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)