STL中优先队列(堆)的详解

文章目录

  • priority_queue的基本介绍
  • 堆(heap)
    • 堆的概念与结构
  • priority_queue 的介绍与使用

priority_queue的基本介绍

这个priority_queue翻译成中文就是优先级队列,但其实我们很难去一眼看出他的意思到底是什么,他的逻辑结构实际上类似于数据结构中的堆(heap),而且是大根堆,即为堆顶为序列的最大值

堆(heap)

堆实际上是一种特殊的二叉树,他最最特殊的点在于可以用数组来存储数据

普通的二叉树是不适合用数组来存储的因为可能会存在大量的空间浪费,而对于完全二叉树更适合用顺序结构存储

堆的概念与结构

学术化的定义堆的概念过于难以理解,我们形象化的来理解他

一棵完全二叉树,他的任意一个节点值总是不大于或者不小于他的父节点的值

若堆顶为最大元素,则称为大根堆,若堆顶为最小元素,则称为小根堆

我们可以按照层次遍历的顺序对二叉树的所有节点进行标号,我们可以发现

$ parent = (child -1) / 2$

c h i l d = p a r e n t ∗ 2 + 1 child = parent*2+1 child=parent2+1

因此我们可以把它放入数组中,例如

这里我们演示了一个小根堆的逻辑结构和存储结构

对于堆的实现来说,他有两个主要的调整算法,向上调整和向下调整算法

当构建堆时,我们采用向上调整算法,例如我们想建立一个小根堆,依次插入数据,当子节点小于父节点时,交换位置即可,直到不小于或者到达堆顶

当取出堆顶元素时,我们采用向下调整算法,同样是小根堆,我们将堆顶元素和最后一个元素调换位置,将最后一个元素弹出,再将此时的堆顶元素向下调整,当子节点小于父节点时交换位置

对于调整和插入的算法复杂度,由于这是二叉树的性质,我们可以直到最坏的情况也只需要将层数遍历一遍,时间复杂度为O(log n)

priority_queue 的介绍与使用

我们了解了堆的基本内容之后再回到优先队列,我们已经知道了他的本质就是一个堆,再来理解就会相当简单

这里我们可以看到,优先队列和队列于栈同样使用了容器适配器,但是默认是一个顺序表,这里也好理解,因为deque的随机访问性能极差,并且这里还出现了一个新的Compare模板是less,这里实际上是一个用于确定大根堆还是小根堆的接口,less表示大根堆,greater表示小根堆

函数说明
priority_queue()/(first,last)空构造与区间构造
empty()判空
top()返回堆顶元素
push()插入
pop()弹出堆顶元素

注意:

  1. 默认优先队列是大堆

  2. 想要变成小堆需要用到greater,示例如下

    #include<vector>
    #include<queue>
    #include<functional>
    
    int main()
    {
        vector<int> v{6,3,1,5,4,2};
        priority_queue<int,vector<int>,greater<int>> q2(v.begin(),v.end());
        return 0;
    }
    
  3. 如果是自定义数据,就需要在自定义类型中提供比较运算符的重载才可以使用

要模拟实现优先级队列,我们需要介绍仿函数的内容,等到下一篇再介绍,感谢支持,如果你发现文章中有任何不严谨或者需要补充的部分,欢迎在评论区指出

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

王美莲(瑞美)在博鳌乡村振兴产业发展大会荣获“乡村振兴带头人”殊荣

近日,博鳌乡村振兴产业发展大会2023年会,在博鳌亚洲论坛国际会议中心隆重召开。本届大会由中国乡村发展协会指导,中国民族贸易促进会、博鳌乡村振兴产业发展大会组委会主办,深圳市益米播科技有限公司承办。 右:原文化部副部长、国家博物馆首任馆长潘震宙 左:广州市越秀区大塘…

电容内容介绍

0 Preface/Foreword 电容&#xff0c;Capacitance&#xff0c;i.e. 电容量&#xff0c;指在给定电位差下自由电荷的储存量&#xff0c;符号为C&#xff0c;单位为F&#xff08;法拉&#xff09;。 电容&#xff0c;指容纳电荷的能力。任何静电场都是由许多电容组成&#xff0…

HTML---盒子模型

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.盒子模型概述 HTML中的盒子模型是一种用于描述和布局元素的概念。每个 HTML 元素都可以被表示为一个矩形的盒子&#xff0c;这个盒子包括四个部分&#xff1a;内容区域、内边距、边框和外边距…

图灵日记之java奇妙历险记--数据类型与变量运算符

目录 数据类型与变量字面常量数据类型变量语法格式整型变量浮点型变量字符型变量希尔型变量类型转换自动类型转换(隐式)强制类型转换(显式) 类型提升不同数据类型的运算小于4字节数据类型的运算 字符串类型 运算符算术运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非…

SpringIOC之MethodBasedEvaluationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

MyBatis的增删改查(CRUD)

目录 查询 1.单个参数绑定 2.序号参数绑定 3.注解参数绑定&#xff08;推荐&#xff09; 4.对象参数绑定&#xff08;推荐&#xff09; 5.Map参数绑定 6.模糊查询 7.sql注入 8.聚合函数查询 删除 修改 添加&#xff08;主键回填&#xff09; 数据库 程序结构 查询 …

GCC:GNU编译器

GCC&#xff08;GNU Compiler Collection&#xff09;是一款广泛使用的开源编译器套件&#xff0c;支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada和Go等。在本文中&#xff0c;我们将通过一个简单的C程序来介绍GCC的编译过程&#xff0c;包括预处理、编译、…

ECMAScript基础入门:猫头虎博主的技术分享

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

怎么定义一套完成标准的JAVA枚举类型

一、背景 在java代码中&#xff0c;接口返回有各种各样的状态&#xff0c;比如400 401 200 500 403等常见的http状态码&#xff0c;也有我们自定义的很多业务状态码。如果系统比较复杂&#xff0c;制定一套完整的标准的状态码是非常有必要的&#xff0c;这样比较方面BUG排查。…

六个探索性数据分析(EDA)工具,太实用了!

当进行数据分析时&#xff0c;探索性数据分析(EDA)是一个至关重要的阶段&#xff0c;它能帮助我们从数据中发现模式、趋势和异常现象。而选择合适的EDA工具又能够极大地提高工作效率和分析深度。在本文中&#xff0c;笔者将介绍6个极其实用的探索性数据分析(EDA)工具&#xff0…

【Python小知识 - 6】:QLabel设置图片

文章目录 QLabel设置图片 QLabel设置图片 from PyQt5.QtWidgets import * from PyQt5.QtGui import * import sysapp QApplication(sys.argv)window QWidget()hbox QHBoxLayout(window)# 设置标签图片 lable QLabel() lable.setPixmap(QPixmap(./img/window.png).scaled(1…

Python中实现消息队列:构建高效异步通信系统的完整指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 消息队列的基础概念 在开始之前&#xff0c;先了解一些消息队列的基础概念。 1 什么是消息队列&#xff1f; 消息队列是一种通信方式&#xff0c;它允许将消息从一个应用程序传递到另一个应用程序。消息队列提…

2022xctf-final hole

这个题是做到的第一个利用hole和map来制造oob的题目&#xff0c;挺有意思的记录一下 首先根据题目给出的信息可知涉及到此漏洞 https://crbug.com/1263462 poc如下&#xff1a; let theHole %TheHole(); m new Map(); m.set(1, 1); m.set(theHole, 1); m.delete(theHole);…

【干货】安全规范着装AI检测算法详解/厂商推荐

关于安全着装算法你知道多少&#xff1f;是不是还局限于口罩、安全帽检测&#xff1f;远不如此&#xff0c;随着AI智能算法的迅速发展&#xff0c;在安全生产领域&#xff0c;人工智能对安全监管的力度也大大增加&#xff0c;今天小编就带大家详细了解一下。 较为基础的安全着装…

Guava的TypeToken在泛型编程中的应用

第1章&#xff1a;引言 在Java世界里&#xff0c;泛型是个相当棒的概念&#xff0c;能让代码更加灵活和类型安全。但是&#xff0c;泛型也带来了一些挑战&#xff0c;特别是当涉及到类型擦除时。这就是TypeToken大显身手的时候&#xff01; 作为Java程序员的咱们&#xff0c;…

TCP/IP:从数据包到网络的演变

引言 TCP/IP协议的起源可以追溯到20世纪60年代末和70年代初&#xff0c;美国国防部高级研究计划局&#xff08;ARPA&#xff09;研究开发一种可靠的通信协议&#xff0c;用于连接分散在不同地点的计算机和资源。 在当时&#xff0c;计算机之间的连接并不像现在这样普遍和便捷…

MySQL,练习

表结构参考&#xff1a;MySQL&#xff0c;等值联结、内部联结、多表连接、自联结、自然联结、外部联结、带聚集函数的联结-CSDN博客 1、找出购买了产品id1023005的客户信息 # 联结三表&#xff0c;再过滤 SELECT customers.* FROM orderitems,orders,customers WHERE orderit…

【String、StringBuilder 和 StringBuffer 的 区别】

✅ String、StringBuilder 和 StringBuffer 的 区别 ✅典型解析✅扩展知识仓✅String 的不可变性✅ 为什么JDK 9 中把String 的char[ ] 改成了 byte[ ] ? ✅为什么String设计成不可变的✅缓存✅安全性✅线程安全✅hashcode缓存✅ 性能 ✅String 的 " " 是如何实现的…

IDEA2023+JDK17+SpringBoot3+MySQL8后端接口开发实战课笔记

概述 花了很长的时间&#xff0c;终于把心心念念的SpringBoot3的实战课整理出来了。 今天是开心的一天&#xff0c;因为又多了一门课程可以奉献给大家&#xff0c;也是难过的一天&#xff0c;那就是又要开始重新找工作了。 如果我的粉丝里面有关于Golang或者Python的相关工作推…

算法题系列7·获得数组中多数元素

目录 题目描述 实现 提交结果 题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;…