算法通关村番外篇-优先队列

大家好我是苏麟 , 今天聊聊优先队列 .

优先队列

我们了解优先队列之前先说说队列 .

队列的特点是什么? 队列的特点是先进先出(FIFO)。

入队列,将新元素置于队尾:

出队列,队头元素最先被移出:

那么,优先队列又是什么样子呢?

优先队列不再遵循先入先出的原则,而是分为两种情况。

  • 最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
  • 最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队

例如有一个最大优先队列,其中的最大元素是8,那么虽然8并不是队头元素, 但出队时仍然让元素8首先出队。

要实现以上需求,利用线性数据结构并非不能实现,但是时间复杂度较高。

优先队列的实现

先来回顾一下二叉堆的特性。

  • 最大堆的堆顶是整个堆中的最大元素。
  • 最小堆的堆顶是整个堆中的最小元素。

因此,可以用最大堆来实现最大优先队列,这样的话,每一次入队操作就是堆 的插入操作,每一次出队操作就是删除堆顶节点。 入队操作具体步骤如下

1. 插入新节点5。

2. 新节点5“上浮”到合适位置。

出队操作具体步骤如下。

1. 让原堆顶节点10出队。

2. 把最后一个节点1替换到堆顶位置。

3. 节点1“下沉”,节点9成为新堆顶。

这里的代码跟堆排序差不多 , 这里就不展示了 .

小结

  • 什么是二叉堆

二叉堆是一种特殊的完全二叉树,分为最大堆和最小堆。

在最大堆中,任何一个父节点的值,都大于或等于它左、右孩子节点的值。

在最小堆中,任何一个父节点的值,都小于或等于它左、右孩子节点的值。

  • 什么是优先队列

优先队列分为最大优先队列和最小优先队列。

在最大优先队列中,无论入队顺序如何,当前最大的元素都会优先出队,这是 基于最大堆实现的。

在最小优先队列中,无论入队顺序如何,当前最小的元素都会优先出队,这是 基于最小堆实现的。


这期就到这里 , 下期见!

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

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

相关文章

从新手到大师:四大编程范式解锁你的编码力!

编程,就是用代码跟计算机交流,告诉它我们想要它做什么。不同的编程范式就是不同的交流方式,每种方式都有自己独特的语法和规则。 今天,我们就来聊聊这四种主要的编程范式,它们分别是命令式、函数式、面向对象和声明式…

华为HCIE课堂笔记第十二章 ICMPv6和NDP协议

第十二章 ICMPv6和NDP 12.1 背景 ICMPv6协议用于IPV6协议的消息传递:地址解析、重复地址检测、无状态地址配置、NDP协议、路径MTU发现。 12.2 ICMPv6介绍 ICMPv6的头部字段包含Type字段、Code字段、校验和字段。 消息分为两种: 查错消息&#xff…

Java 堆的设计,如何用堆进行排序

Java 学习面试指南:https://javaxiaobear.cn 1、堆的定义 堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。 1、堆的特性 它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层…

听GPT 讲Rust源代码--compiler(33)

File: rust/compiler/rustc_middle/src/macros.rs 在Rust源代码中,rust/compiler/rustc_middle/src/macros.rs文件的作用是定义了一些用于宏展开的辅助宏和宏规则。 首先,这个文件导入了许多其他相关的模块,这些模块定义了编译器内部所需要的…

2023年12 月电子学会Python等级考试试卷(三级)答案解析

青少年软件编程(Python)等级考试试卷(三级) 分数:100 题数:38 一、单选题(共25题,共50分) 1. 一个非零的二进制正整数,在其末尾添加两个“0”,则该新数将是原数的?( ) A. 10倍

详解Java中的原子操作

第1章:什么是原子操作 大家好,我是小黑,面试中一个经常被提起的话题就是“原子操作”。那么,到底什么是原子操作呢?在编程里,当咱们谈论“原子操作”时,其实是指那些在执行过程中不会被线程调度…

1329:【例8.2】细胞 广度优先搜索

1329:【例8.2】细胞 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 一矩形阵列由数字0 到9组成,数字1到9 代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如: 4 10 0234500067 1034560500 2045600671 00000000…

Golang leetcode242有效字符异位词 哈希表map 排序

有效的字母异位词 leetcode242 普通的使用map表进行记录的方法 由于题目规定只有26个小写的英文字符,因此我们直接建立26容量的map func isAnagram(s string, t string) bool {//创建储存记录的map表sTable : make(map[int32]int, 26)tTable : make(map[int32]in…

最新-mybatis-plus 3.5分页插件配置

mybatis-plus 3.5分页插件配置 前提 1.项目不是springboot, 是以前的常规spring项目 2.mp 从3.2升级到3.5,升级后发现原本的分页竟然不起作用了,每次查询都是查出所有 前后配置对比 jar包对比 jsqlparser我这里单独引了包,因为版本太低…

数据结构入门到入土——链表(2)

目录 一,与链表相关的题目(2) 1.输入两个链表,找出它们的第一个公共节点 2.给定一个链表,判断链表中是否有环 3.给定一个链表,返回链表开始入环的第一个节点,若无则返回null 一,…

java字节码

1. 字节码 1.1 什么是字节码? Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供…

机器学习模型可解释性的结果分析

模型的可解释性是机器学习领域的一个重要分支,随着 AI 应用范围的不断扩大,人们越来越不满足于模型的黑盒特性,与此同时,金融、自动驾驶等领域的法律法规也对模型的可解释性提出了更高的要求,在可解释 AI 一文中我们已…

调用三方的注意事项

三方包括什么 狭义上的三方:外部提供的rpc、http接口。广义上的三方:sdk、存储、消息队列、配置中心等外部团队维护的组件。 为什么要格外注意对三方依赖的处理 归属于外部团队甚至外部公司,相比自身更加不可控,容易出现&#…

Monkey:提升 Android 应用稳定性与性能的利器

Monkey 测试工具是一种用于自动化 Android 应用程序的随机事件生成器。它可以帮助开发人员发现应用程序中的错误和漏洞,提高应用程序的稳定性和可靠性。本文将介绍 Monkey 测试工具的基本概念、使用方法以及一些常见的应用场景。 一、Monkey 测试工具的基本概念 1…

案例介绍|钡铼助力2023年全国职业院校技能大赛工业网络智能控制与维护赛项

如今,越来越多的企业开始意识到数字制造和工业物联网已经成为工业自动化中大规模生产的核心驱动力。这其中,工业网络作为基础设施,是实现工厂设备联网与数据采集,建设数字工厂的基础和前提,甚至成为关乎数字工厂能否真…

leetcode47,leetcode491,leetcode40,leetcode90,系列问题包你懂!!!Trie树对于排列问题、组合等结果集去重的应用

leetcode47. 全排列 II,leetcode491. 非递减子序列,leetcode40. 组合总和 II,leetcode90. 子集 II 题目 不过多赘述 思路 实际上这几题是相同的,都是求一个结果集合,然后集合中的元素不能重复。并且每一个元素都满…

给您的应用添加弹窗

概述 在我们日常使用应用的时候,可能会进行一些敏感的操作,比如删除联系人,这时候我们给应用添加弹窗来提示用户是否需要执行该操作,如下图所示: 弹窗是一种模态窗口,通常用来展示用户当前需要的或用户必须…

thinkphp学习02-目录结构、控制器、路由、配置文件

目录结构 www WEB部署目录(或者子目录) ├─app 应用目录 │ ├─controller 控制器目录 │ ├─model 模型目录 │ ├─ ... 更多类库目录 │ │ │ ├─common.php 公共函数文件 │ └─event.ph…

鸿蒙OS:不止手机,是物联网应用开发

鸿蒙开发是华为自主研发的面向全场景的分布式操作系统,旨在将生活场景中各类终端进行整合,实现不同终端设备间的快速连接、资源共享、匹配合适设备、提供流畅的全场景体验。 鸿蒙开发具有以下特点: 面向全场景:鸿蒙系统能够覆盖…

循环平稳信号分析方法在旋转机械设备状态监测和故障诊断中的应用

旋转机械设备是现代社会中不可或缺的重要组成部分,广泛应用于航空航天、汽车制造、电力系统等领域。然而,由于旋转机械设备的复杂性和工作环境的恶劣性,其运行过程中可能出现各种故障,导致设备性能下降甚至发生事故。因此&#xf…