从零开始手写STL库:Priority_Queue

从零开始手写STL库–Priority_Queue的实现

Gihub链接:miniSTL


文章目录

  • 从零开始手写STL库–Priority_Queue的实现
  • 一、priority_queue是什么?
  • 二、堆是什么?
  • 三、priority_queue要包含什么函数
  • 总结


一、priority_queue是什么?

优先队列在力扣刷题中可能会出现,实际上就是一个带有权重优先级的队列

在这个队列中,所有元素都会有一个权重,队列会根据权重来对元素排序

这也就是所谓的“优先”,而这个优先顺序是可以自己定义的

对int型优先队列,STL库默认是把数据从大到小排序的

所以难点在于如何排序,答案是基于堆来构建优先队列

那么问题也就明确了,所谓优先队列的考察,实际上是对数据结构–的考察

二、堆是什么?

堆(Heap)是一种特殊的完全二叉树,它满足下面的性质:

结构性质: 堆是一个完全二叉树,这意味着除了最后一层外,每一层都是完全填满的,而最后一层的节点则尽可能地集中在左边。

堆性质: 在一个最大堆(Max Heap)中,每个节点的值都大于或等于其子节点的值,根节点的值是堆中的最大值。相反,在一个最小堆(Min Heap)中,每个节点的值都小于或等于其子节点的值,根节点的值是堆中的最小值。

实际上堆可以用队列实现,不需要真的构建一个二叉树,只需要构建两个维护函数即可

三、priority_queue要包含什么函数

首先明确一下两个维护函数,即向上维护和向下维护

    void heapUp(){int index = data.size() - 1;while (index){int parentIndex = (index - 1) / 2;if(data[index] > data[parentIndex]){std::swap(data[index], data[parentIndex]);index = parentIndex;}else break;}}void heapDown() {int index = 0;int size = data.size();while (1) {int leftChild = 2 * index + 1;int rightChild = 2 * index + 2;int largest = index;if (leftChild < size && data[leftChild] > data[largest]) largest = leftChild;if (rightChild < size && data[rightChild] > data[largest]) largest = rightChild;if (largest != index) {std::swap(data[index], data[largest]);index = largest;} else break;}}

本处实现就不考虑string或者其他类型的队列了,只考虑int和double型队列

这里向上向下维护实际上就是堆排序的上浮和下沉

上浮:如果父节点比k结点小,就交换他们的位置
下沉:如果k结点比它的两个子结点小,则与较大的那个交换

之后就是正常的一层双向队列封装,只需要每次插入和删除的时候维护一下堆即可

template <typename T, typename Container = myDeque<T> >
class myPriQue
{
private:Container data;void heapUp(){int index = data.size() - 1;while (index){int parentIndex = (index - 1) / 2;if(data[index] > data[parentIndex]){std::swap(data[index], data[parentIndex]);index = parentIndex;}else break;}}void heapDown() {int index = 0;int size = data.size();while (1) {int leftChild = 2 * index + 1;int rightChild = 2 * index + 2;int largest = index;if (leftChild < size && data[leftChild] > data[largest]) largest = leftChild;if (rightChild < size && data[rightChild] > data[largest]) largest = rightChild;if (largest != index) {std::swap(data[index], data[largest]);index = largest;} else break;}}  public:myPriQue() {};myPriQue(const Container & c) : data(c) {int size = data.size();for(int i = (size / 2) - 1; i >= 0; i --) heapDown();}void push(const T & value){data.push_back(value);heapUp();}void pop(){if (!data.empty()){std::swap(data[0], data[data.size() - 1]);data.pop_back();heapDown();}else throw std::runtime_error("Stack is empty!");}T& top() {if (!data.empty()) return data[0];else throw std::runtime_error("Priority queue is empty.");}bool empty()  {return data.empty();}size_t size() const {return data.size();}
};

总结

优先队列一般也不会作为考察重点,在力扣中更多地是考虑如何利用vector或者queue自己构建一个专属的优先队列来解决问题,比如单调栈,实际上也是一种优先队列

只需要知道优先队列是以堆为基础构建的即可

至此,简单STL库实现教程完成。由于本人初学,博客中或许会有不对之处,也请读者指出,完整代码异步GitHub链接。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的图像去噪与去模糊

基于深度学习的图像去噪和去模糊是计算机视觉中的重要任务&#xff0c;旨在提升图像质量&#xff0c;去除噪声和模糊。以下是这两个领域的主要方法和技术概述&#xff1a; 1. 图像去噪 图像去噪的目标是去除图像中的噪声&#xff0c;同时尽量保留细节。主要方法包括&#xff…

程序一毛,人生九牛

Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

Vue3动态导入后端路由

动态获取文件 // modules就是一个map&#xff0c;文件路径作为key&#xff0c;文件对象作为value const modulesimport.meta.glob(../views/**/*.vue)获取到的modules对象如下&#xff1a; 添加动态路由 import {createRouter, createWebHashHistory} from vue-routerconst m…

AutoGen实现多代理—AI Agentic Design Patterns with AutoGen(二)

1. AutoGen顺序对话在客户入职案例上的应用 如图&#xff0c;客户入职前会经历三个阶段&#xff0c;一个代理收集客户的信息&#xff0c;一个代理收集客户的感兴趣话题&#xff0c;一个代理根据前两个代理的基础信息与客户代理对话&#xff0c;产生聊天信息。 本节实验的地址&…

汽车保养BBBBBBBBBBB

小保养就是机油和机滤&#xff0c;4s店比较贵&#xff0c;可以在京东上买机油&#xff0c;可以包安装 极护、磁护 两款机油配方不同&#xff0c;极护系列机油注入液钛配方&#xff0c;拥有特别的油膜自适应能力&#xff0c;在各种形式条件下均能有效减少金属间的直接接触&…

Cilium + ebpf 系列文章-什么是ebpf?(一)

前言&#xff1a; 这篇非常非常干&#xff0c;很有可能读不懂。 这里非常非常推荐&#xff0c;建议使用Cilium官网的lab来辅助学习&#xff01;&#xff01;&#xff01;Resources Library - IsovalentExplore Isovalents Resource Library, your one-stop destination for ins…

unittest初始化,资源清理,执行所有测试用例,跳过测试用例,输出测试结果的详细程度以及discover加载文件里面的所有匹配到的.py测试用例

前言 # setUp和tearDown 每次用例执行前都会执行初始化条件和结束条件 # 执行所有用例只运行一次初始化和清理条件&#xff0c;用setupclass&#xff0c;teardownclassimport unittestclass UserTestCase(unittest.TestCase):classmethoddef setUpClass(cls):print("setU…

【蚂蚁HR-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

240929-CGAN条件生成对抗网络

240929-CGAN条件生成对抗网络 前面我们学习了GAN&#xff08;240925-GAN生成对抗网络-CSDN博客&#xff09;和DCGAN&#xff08;240929-DCGAN生成漫画头像-CSDN博客&#xff09;&#xff0c;接下来继续来看CGAN&#xff08;Conditional GAN&#xff09;条件生成对抗网络。 流…

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…

ros的工作空间

Create a ROS Workspace创建一个ros工作空间 $ catkin_make该命令可以在当前目录下的“src”文件夹中创建CMakeLists.txt链接。会自动生成build和devel文件&#xff0c;以下是 catkin_make 的几个主要作用&#xff1a; 构建 ROS 包&#xff1a;catkin_make 会在当前工作空间中…

【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修

一、OSPF介绍 开放式最短路径优先协议OSPF(Open Shortest Path First),IPv4使用的OSPFv2,针对IPv6使用OSPFv3协议。 二、为什么需要OSPF OSPF出现之前,网络广泛使用RIP路由协议,RIP由于最大16跳数限制无法适应大型网络,RIP是基于距离矢量算法的路由协议,应用在大型网…

Cesium GIS项目关于湖泊识别与提取的实现

1. 引言 项目背景 随着遥感技术的发展,地理信息系统的应用越来越广泛。本项目旨在开发一个基于Cesium的地理信息系统,利用深度学习技术自动识别并显示湖泊的位置。 目标与意义 通过自动化处理大量遥感影像数据,提高湖泊监测的效率和准确性,为水资源管理和环境保护提供支…

uniapp js判断key是否在json中?

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

PG数据库的Jsonb全文检索查询

1.操作键值对 PostgreSQL 对 jsonb 类型的筛选查询可以使用 -> 或者 ->> 操作符。 -> 操作符用于通过 JSON 对象中的键来获取对应的值。->> 操作符可以将获取到的值提取出来转化为字符串类型。 例如&#xff0c;下面是一个包含 jsonb 类型字段的表&#x…

Python程序:设计一个多维度数据聚合系统:从概念到实现

设计一个多维度数据聚合系统:从概念到实现 在现代数据驱动的世界中,企业和组织需要处理和分析大量的数据,以便做出明智的决策。数据聚合系统是实现这一目标的关键工具之一。本文将详细介绍如何设计和实现一个支持多维度数据汇总的数据聚合系统,使用Python编程语言。我们将…

状态模式原理剖析

《状态模式原理剖析》 状态模式&#xff08;State Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。换句话说&#xff0c;当对象状态发生变化时&#xff0c;它的行为也会随之变化。 通过状态模式&#xff0c;可以消除通过 if-else…

计241 作业2:C程序设计初步

问题 A: C语言实验——计算AB&#xff08;顺序结构&#xff09; 思路讲解: 这个直接计算ab就好&#xff0c;没有什么困难的&#xff0c;用来熟悉环境最适合不过 代码实现: #include<stdio.h>int main() {int a,b;scanf("%d %d",&a,&b);printf("…

[JavaEE] IP协议

目录 一、 IP协议 1.1 基本概念 1.2 协议头格式 1.3 特殊IP 二、 地址管理 2.1 网段划分 2.2 CIDR(Classless Interdomain Routing) 2.3 私有IP地址和公网IP地址 2.4 NAT(Network Address Translation)-网络地址转换 2.5 路由选择 三、数据链路层 3.1 认识以太网 3…