优先级队列介绍和模拟实现

个人主页:Lei宝啊 

愿所有美好如期而遇


Container就是适配器,也就是说这个优先级队列的底层就使用vector,当然,我们也可以使用deque来适配,但是对于优先级队列来说,效率是低于vector的,因为优先级队列本质就是堆,我们需要用到下标来进行向上或者向下调整,而deque虽然可以使用下标索引,同时也具备链式结构,但是单独拉出来一个功能效率是不如vector和queue的,所以使用deque适配的效率不如vector,同时这里是不能用queue来适配的。

上面我们也可以看见Compare默认是less,也就是说优先级队列默认是建大堆的(尽管使用less建大堆,greater建小堆看着很难受,但库就是这么实现的)。

push方法,就是向优先级队列里插入元素,同时调整成堆,pop方法,就是删除堆顶元素,同时向下调整维持堆的结构。

其他方法我们不多赘述,接下来开始模拟实现优先级队列。

首先将Compare仿函数实现出来,这里就要介绍什么是仿函数:

	template<class T>class Less{public:bool operator()(const T& x, const T& y){return x > y;}};template<class T>class Greater{public:bool operator()(const T& x, const T& y){return x < y;}};

我们平时调用函数时是这样:比如有一个int add(int a,int b)函数,我们调用时是这样add(1,2),那么仿函数就是:类里重载了()运算符的operator(),使得这个类使用起来像一个函数。

我们使用时先创建这个类的对象,比如Less compare; 然后比较大小就是这样:compare(1,2),是不是很类似于函数?

接着就是优先级队列的内部构造:

其中的核心也就是堆向上调整,堆向下调整,数据的插入和删除,也就这么四个核心点,type就是我们要适配的容器。

	//默认建大堆template<class T, class type = vector<int>, class compare = Less<T>>class priority_queue{public:priority_queue() {};template <class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){q.push_back(*first);judge_up(size() - 1);first++;}}bool empty() const{return q.empty();}int size() const{return q.size();}T& top(){return q.front();}const T& top() const{return q.front();}void judge_up(int child){int parent = (child - 1) / 2;while (child){if (com(q[child], q[parent])){swap(q[child], q[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){q.push_back(x);judge_up(size() - 1);}void judge_down(int parent){int child = parent * 2 + 1;while (child < size()){if (child + 1 < size() && !com(q[child], q[child + 1])){child++;}if (com(q[child], q[parent])){swap(q[child], q[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){swap(q[0], q[size() - 1]);q.erase(q.end() - 1);judge_down(0);}private:type q;compare com;};}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2815603.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【前端素材】推荐优质在线家具电商Bazu平台模板(附源码)

一、需求分析 1、系统定义 家具电商平台是指专门销售家具产品的在线电子商务平台。这些平台专注于家具类商品的销售和服务&#xff0c;为消费者提供方便快捷的购买体验。 2、功能需求 家具电商平台是指专门销售家具产品的在线电子商务平台。这些平台专注于家具类商品的销售…

从此告别手忙脚乱!职场高手管理多微信的技巧

在现在职场&#xff0c;微信已经成为了必不可少的沟通工具之一。然而&#xff0c;随着工作联系人的增多&#xff0c;管理多个微信账号可能会变得一团糟。今天&#xff0c;我们就来分享一些职场高手们管理多个微信账号的技巧&#xff0c;让你从此告别手忙脚乱的状态&#xff01;…

搜维尔科技:OptiTrack 提供了性能最佳的动作捕捉平台

OptiTrack 动画 我们的 Prime 系列相机和 Motive 软件相结合&#xff0c;产生了世界上最大的捕获量、最精确的 3D 数据和有史以来最高的相机数量。OptiTrack 提供了性能最佳的动作捕捉平台&#xff0c;具有易于使用的制作工作流程以及运行世界上最大舞台所需的深度。 无与伦比…

Python 画 箱线图

Python 画 箱线图 flyfish 箱线图 其他名字 盒须图 / 箱形图 横向用正态分布看 垂直看 pandas画 import pandas as pdimport seaborn as sns import matplotlib.pyplot as plt import pandas as pddf pd.read_csv(sh300.csv) print("原始数据") print(df.he…

ARTS Week 17

Algorithm 本周的算法题为 989. 数组形式的整数加法 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如&#xff0c;对于 num 1321 &#xff0c;数组形式是 [1,3,2,1] 。 给定 num &#xff0c;整数的 数组形式 &#xff0c;和整数 k &#xff0c;返回 整数 n…

【算法历练】动态规划副本—路径问题

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;宙でおやすみ 1:02━━━━━━️&#x1f49f;──────── 2:45 &#x1f504; ◀️ ⏸ ▶️ ☰ &#…

在Node.js中如何实现用户身份验证和授权

当涉及到构建安全的应用程序时&#xff0c;用户身份验证和授权是至关重要的一环。在Node.js中&#xff0c;我们可以利用一些流行的库和技术来实现这些功能&#xff0c;确保我们的应用程序具有所需的安全性。本篇博客将介绍如何在Node.js中实现用户身份验证和授权。 用户身份验…

《真象还原》读书笔记——第八章 内存管理系统(字符串操作、位图定义与实现)

8.1 makefile 8.2 实现 assert 断言 8.2.1 实现开、关中断的函数 kernel/interrupt.c 补充了获取中断状态和设置中断的函数 #include "io.h" #include "interrupt.h" #include "stdint.h" #include "global.h" #include "prin…

Navicat Premium创建MySQL存储过程

1、点击“函数”&#xff0c;新建函数&#xff1b; 2、选择“过程”&#xff0c;输入存储过程名称&#xff0c;点击完成即可&#xff0c;可以跳过参数的设置&#xff1b; 3、编写存储过程的代码&#xff0c;保存&#xff1b; CREATE DEFINERrootlocalhost PROCEDURE insertuser…

【DDD】学习笔记-领域驱动设计对持久化的影响

资源库的实现 如何重用资源库的实现&#xff0c;以及如何隔离领域层与基础设施层的持久化实现机制&#xff0c;具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA&#xff08;当然也包括基于 .NET 的 Entity Framework、NHibernat…

​LeetCode解法汇总2673. 使二叉树所有路径值相等的最小代价

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个整数 n 表示一棵 满二叉树 里面节…

抖音作品评论id提取工具|视频内容提取软件

抖音视频提取便捷高效&#xff0c;抖音作品评论id提取工具助您快速获取数据 针对抖音作品评论id提取的需求&#xff0c;我们推出了一款功能强大的工具&#xff0c;旨在帮助用户快速提取抖音作品的评论id。无论您是进行数据分析、社交媒体研究还是其他用途&#xff0c;我们的工…

Linux------进程地址空间

目录 一、进程地址空间 二、地址空间本质 三、什么是区域划分 四、为什么要有地址空间 1.让进程以统一的视角看到内存 2.进程访问内存的安全检查 3.将进程管理与内存管理进行解耦 一、进程地址空间 在我们学习C/C的时候&#xff0c;一定经常听到数据存放在堆区、栈区、…

java多线程并发实战,java高并发场景面试题

阶段一&#xff1a;筑基 Java基础掌握不牢&#xff0c;对于一个开发人员来说无疑是非常致命的。学习任何一个技术知识无疑不是从基础开始&#xff1b;在面试的时候&#xff0c;面试官无疑不是从基础开始拷问。 内容包括&#xff1a;Java概述、Java基本语法、Java 执行控制流程、…

代码随想录算法训练营第26天—回溯算法06 | ● *332.重新安排行程 ● *51. N皇后 ● *37. 解数独 ● 总结

*332.重新安排行程 https://programmercarl.com/0332.%E9%87%8D%E6%96%B0%E5%AE%89%E6%8E%92%E8%A1%8C%E7%A8%8B.html 考点 图论里的深度优先搜索&#xff08;本题使用回溯来解决&#xff09;这是一道hard题&#xff0c;一刷先放过去&#xff0c;二刷有精力再做 我的思路 无思…

Hybird App开发,纯血鸿蒙系统快速兼容救星

2024年1月18日的开发者&#xff08;HDC&#xff09;大会上&#xff0c;就官宣了“纯血鸿蒙”操作系统即将于2024年3季度正式投产。与此同时&#xff0c;支付宝、京东、小红书、微博、高德地图、中国移动等在内的超百个头部应用都启动了鸿蒙原生应用开发&#xff0c;鸿蒙开发者日…

多域名ov ssl证书1200元

SSL证书是一种特殊的数字证书产品&#xff0c;它是维护互联网信息安全的重要手段之一&#xff0c;部署到服务器之后可以保护网站信息传输安全。因此&#xff0c;随着互联网的发展&#xff0c;SSL证书也随之越来越受到众多开发者的重视。SSL证书的数字证书产品多种多样&#xff…

手写mybatis插件之分页查询

yml文件 server:port: 8081mybatis:mapper-locations: classpath:mapper/*.xmlconfig-location: classpath:mybatis-config.xmlspring:datasource:password: 1234username: rootdriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis?useUnicod…

react-组件基础

1.目标 能够使用函数创建组件 能够使用class创建组件 能够给React元素绑定事件 能够使用state和setState() 能够处理事件中的this指向问题 能够使用受控组件方式处理表单 2.目录 React组件介绍 React组件的两种创建方式 React事件处理 有状态组件和无状态组件 组件中的state…

4G工牌室内外定位系统

4G工牌室内外定位系统是一种高效、精准的定位技术&#xff0c;它利用4G通信网络和GPS卫星定位系统&#xff0c;实现了对人员和物品的实时跟踪和定位。该系统广泛应用于企业管理、安全监控、智能交通等领域&#xff0c;为企业提供了更加高效、便捷的管理方式。 在室内环境中&am…