【数据结构】优先队列
优先队列
- API
- 初级实现
- 使用堆实现
- 由下至上的堆有序化(上浮)
- 由上至下的堆有序化(下沉)
- 插入和删除元素
- 具体实现
很多情况下我们需要有序的处理输入的元素,但是又不需要输入的元素全部有序,或者不需要一次将它们排序出来。还有的情况的输入的元素不是一次性给出的,需要我们根据需要实时获取最大值或者最小值。这时候我们就可以使用优先队列实现我饿们的需求。
API
| public class MaxPQ <Key extends Comparable<Key>> | |
|---|---|
| MaxPQ() | 创建一个优先队列 |
| MaxPQ(int max) | 创建一个初始容量为max的优先队列 |
| MaxPQ(Key[] a) | 用a[]中的元素创建一个优先队列 |
| void insert(Key v) | 向优先队列中插入一个元素 |
| Key max() | 返回最大元素 |
| Key delMax() | 删除返回最大元素 |
| boolean isEmpty() | 返回队列是否为空 |
| int size() | 返回优先队列中元素个数 |
初级实现
初级实现是使用一个数组或者链表,在插入时或者获取最大元素动态维护数组或者链表的有序性并使得调用对应获取最大值的API能正确获取结果。
使用堆实现
当一棵二叉树的每个结点都大于等于它的两个子节点时,它被称为堆有序。根节点是堆有序的二叉树中的最大结点。二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级存储(不使用数组的第一个位置)
由下至上的堆有序化(上浮)
如果堆有序的状态因为某个节点变得比它的父节点更大而被打破,那么我们就需要通过交换它和它的父节点来修复堆。交换后,这个节点比它的两个子节点都打,但这个节点仍然可能比它现在的父节点更大。我们可以一遍遍地使用同样地办法恢复秩序,将这个节点不断向上移动直到我们遇到一个更大的父节点。
private void swim(int k) {while (k > 1 && less(k / 2, k)) {exch(k/2, k);k /= 2;}
}
由上至下的堆有序化(下沉)
如果堆有序状态因为某个结点变得比它的两个子节点或是其中之一更小而被打破了,那么我们可以通过将它和它的两个子节点中的较大者交换来恢复堆。交换可能会在子节点处继续打破堆的有序状态,因此我们需要不断地用相同的方式将其修复,将节点下移直到它的子节点都比它更小或者到达了堆的底部。
private void sink(int k) {while (2 * k <= N) {int j = 2 * k;if (j < n && less(j, j + 1)) ++j;if (!less(k, j)) break;exch(k, j);k = j;}
}
插入和删除元素
插入新元素:我们将新元素添加到数组末尾,增加堆的大小并让这个新元素上浮到合适的位置。
删除最大元素:我们将数组顶端删去最大的元素并将数组的最后一个元素放到顶端,减小堆的大小并让这个元素下沉到合适的位置。
具体实现
public class MaxPQ <Key extends Comparable<Key>> {private Key[] pq;private int N = 0;public MaxPQ(int maxN) {pq = (Key[]) new Comparable[maxN + 1];}public boolean isEmpty() {return N == 0;}public int size() {return N;}public void insert(Key v) {pq[++N] = v;swim(N);}public Key delMax() {Key max = pq[1];exch(1, N--);pq[N + 1] = null;sink(1);return max;}private boolean less(int i, int j)private void exch(int i, int j)private void swim(int k)private void sink(int k)
}
对于一个含有N个元素的基于堆的优先队列,插入元素操作只需不超过(logN + 1)次比较,删除最大元素的操作需要不超过2logN次比较
相关文章:
【数据结构】优先队列
优先队列 API初级实现使用堆实现由下至上的堆有序化(上浮)由上至下的堆有序化(下沉)插入和删除元素具体实现 很多情况下我们需要有序的处理输入的元素,但是又不需要输入的元素全部有序,或者不需要一次将它们…...
如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1
作者:双飞(花名:小鱼) 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好,我是 StoneDB 的实习生小鱼,目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久,…...
AMEYA360:尼得科科宝旋转型DIP开关系列汇总
旋转型DIP开关 S-4000 电路:BCD(十进制) 代码格式:实码 安装类型:表面贴装 调整位置:顶部 可水洗:无 端子类型:J 引线, 鸥翼型 旋转型DIP开关 SA-7000 电路:BCD(十进制), BCH(十六进制) 代码格式…...
为什么感觉 C/C++ 不火了?
首先C和C是两个非常不一样的编程语言。 C语言在系统开发领域地位非常稳固,几乎没有替代产品。应用层开发近年来略微有被Rust取代的迹象。 C由于支持的编程范式过多,导致不同水平的人写出来的代码质量差异太大,这给软件的稳健性带来了很大的…...
【Linux】在服务器上创建Crontab(定时任务),自动执行shell脚本
业务场景:该文即为上次编写shell脚本的姊妹篇,在上文基础上,将可执行的脚本通过linux的定时任务自动执行,节省人力物力,话不多说,开始操作! 一、打开我们的服务器连接工具 连上服务器后,在任意位置都可以执行:crontab -e 如果没有进入编辑cron任务模式 根据提示查看…...
内存分析工具之Mat
自定义类MatClazz内存个数为9521。当前对象占用内存为16个字节。不包括其属性bytes的字节数。 通过查看MatClazz引用的类之byte数组之bytes。其单个数组占用的字节数为10256。整个内存MatClazz中属性bytes占用的byte[]字节数为97746376,与直方图统计趋近。 通过选…...
【逗老师的PMP学习笔记】项目的运行环境
一、影响项目运行的因素 主要分两种因素 事业环境因素(更多的是制约和限制因素)组织过程资产(可以借鉴的经验和知识) 1、细说事业环境因素(更多的是制约和限制因素) 资源可用性 例如包括合同和采购制约…...
Rust- 模块
(1)在项目根目录下创建mylib(里面实现自定义的外部模块) cargo new --lib mylib (2)在 项目名\mylib\src\lib.rs文件中实现新模块 pub mod add_salary {pub fn study(name: String) {println!("Rust…...
【开源源码学习】
C 迷你高尔夫 一款打高尔夫的游戏。亮点是碰撞反应和关卡设计。 GitHub - mgerdes/Open-Golf: A cross-platform minigolf game written in C. TypeScript 俄罗斯方块 复刻经典的俄罗斯方块,项目采用ReactReduxImmutable的技术栈。 GitHub - chvin/react-tetr…...
CNN-NER论文详解
论文:https://arxiv.org/abs/2208.04534 代码:https://github.com/yhcc/CNN_Nested_NER/tree/master 文章目录 有关工作前期介绍CNN-NER模型介绍 代码讲解主类多头biaffineCNNLoss解码数据传入格式 参考资料 有关工作 前期介绍 过去一共主要有四类方式…...
利用ChatGPT制作行业应用:哪些行业最受益
引言 随着人工智能技术的快速发展,ChatGPT(Chat Generative Pre-trained Transformer)成为了一种引人注目的工具,它能够生成自然流畅的对话内容。这种技术不仅在娱乐领域有着广泛的应用,还可以在各个行业中发挥重要作…...
【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用
【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用 一、QNX 侧:创建分区、配置下载、配置透传1.1 修改分区表,新增 android_test 分区,大小为 2GByte1.2 配置下载 android_test.img 镜像1.3 配置 /dev/disk/android_test_a 分区透传到 …...
Linux 用户和权限
一、root 用户 root 用户(超级管理员) 无论是windows、Macos、Linux均采用多用户的管理模式进行权限管理。在Linux系统中,拥有最大权限的账户名为:root (超级管理员)。 root用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的。…...
分布式应用:ELFK集群部署
目录 一、理论 1.ELFK集群 2.filebeat 3.部署ELK集群 二、实验 1. ELFK集群部署 三、总结 一、理论 1.ELFK集群 (1)概念 ELFK集群部署(FilebeatELK),ELFK ES logstashfilebeatkibana 。 数据流 架构 2.fi…...
Quartz使用文档,使用Quartz实现动态任务,Spring集成Quartz,Quartz集群部署,Quartz源码分析
文章目录 一、Quartz 基本介绍二、Quartz Java 编程1、文档2、引入依赖3、入门案例4、默认配置文件 三、Quartz 重要组件1、Quartz架构体系2、JobDetail3、Trigger(1)代码实例(2)SimpleTrigger(3)CalendarI…...
Go -- 测试 and 项目实战
没有后端基础,学起来真是费劲,所以打算速刷一下,代码跟着敲一遍,有个印象,大项目肯定也做不了了,先把该学的学了,有空就跟点单体项目,还有该看的书.... 目录 🍌单元测试…...
GitHub基本使用
GitHub搜索 直接搜索 直接搜索关键字 明确搜索仓库标题 语法:in:name [关键词]展示:比如我们想在GitHub仓库中标题中搜索带有SpringBoot关键词的,我们可以样搜: in:name SpringBoot 明确搜索描述 语法:in:description [关键词]展…...
微信小程序生成带参数的二维码base64转png显示
getQRCode() {var that this;wx.request({url: http://localhost:8080/getQRCode?ID 13,header: {content-type: application/json},method: POST,responseType: arraybuffer,//将原本按文本解析修改为arraybuffersuccess(res) {that.setData({getQRCode: wx.arrayBufferToB…...
量子计算机:下一代计算技术的奇点
介绍 量子计算机是一种基于量子力学原理的全新计算技术,它利用量子比特的特性进行计算,具有破解当前经典计算机难以解决问题的潜力。在过去几十年里,量子计算机一直是计算机科学领域的一个热门话题。本篇博客将深入探讨量子计算机的基本原理…...
【ChatGPT】ChatGPT是如何训练得到的?
前言 ChatGPT是一种基于语言模型的聊天机器人,它使用了GPT(Generative Pre-trained Transformer)的深度学习架构来生成与用户的对话。GPT是一种使用Transformer编码器和解码器的预训练模型,它已被广泛用于生成自然语言文本的各种…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
