当前位置: 首页 > article >正文

使用C++构建一个优先级队列

1.优先级队列的介绍

   优先级队列是一种特殊的队列数据结构,它是队列,但又不完全是,因为它要将装载的数据进行优先级排序,找到一个最大或者最小优先级的元素,下一次出队列的元素就是这个元素,所以说它不完全是一个队列,优先级队列广泛应用于任务调度、资源分配、事件处理、Dijkstra算法、A*搜索算法等领域。

2.优先级队列的设计

 个人感觉,设计一个优先级队列就是一个堆建立和调整的过程,因为要装载元素,所以我们采用vector来作为成员变量,后续就是对与这个vector变量的管理就行了,因为我们只是简单设计一个优先级队列,所以并没有设计在优先级队列中传入函数进行比较的过程,只是简单的比较大小的过程,首先我们要设计向上调整函数和向下调整函数,因为这个的构造函数和析构函数非常简单,这里我就不过多赘述了。

向上调整函数

向上调整函数就是子节点与父节点做比较,这里我们假设建小堆,如果子节点小于父节点,那么这个堆就是有问题的,所以要进行交换,将子节点与父节点进行交换,但是我们又要考虑交换以后得子节点也就是现在的父节点是否和他现在的父节点又是不对的关系的,所以我们要进行循环,只有当节点为0,也就是根节点或者,子节点小于父节点时,进行循环退出

void siftUp(size_t index)
{
    
    while (index > 0)
    {
        int father = index / 2;
        
        if (list[father] > list[index])
        {
            swap(list[father], list[index]);
            index = father;
        }
        else
        {
            break;
        }
    }
}

向下调整函数

向下调整就是判断你是否比你的两个孩子都要小,逻辑和向上调整函数差不多,只是要和两个孩子都比一次,或者找最小的那个孩子比,主要是要知道孩子是index/2-1和index/2-2就行

void siftDown(size_t index)
{
    while (index <= list.size())
    {
        leftson = index * 2 + 1;
        rightson = index * 2 + 2;
        if (list[index] > list[leftson])
        {
            swap(list[index], list[leftson])
                index = leftson;
        }
        else if (list[index] > list[rightson])
        {
            swap(list[index], list[rightson]);
            index = rightson;
        }
        else
        {
            break;
        }
    }
}

建堆函数

在构造函数的第一步肯定是拷贝构造对应的vector,然后得到的这个vector大概率不是一个堆,因此要对它进行调整,使得它可以成为一个符合规则的堆,一般建堆有两种策略,一种是自下而上的sift down方法,另一种是自上而下的sift up方法。这里我们使用sit down 向下调整的方法,找到最后一个非叶子节点,也就是list.size()/2,然后对每个非叶子节点进行向下调整

explicit Heap(const std::vector<T>& array)
    :list(array)
{
    buildHeap();
}
void buildHeap()
{
    for (int i = list.size() / 2 ; i >=0  ; i--)
    {
        siftDown(i);
   }
}

插入函数

当我们插入一个元素时,我们首先是尾插入vector列表,然后对这个元素进行向上调整,就使得这个堆变得规则

void insert(const T& value)
{
    list.insert(value);
    siftUp(list.size() - 1);
}

获取顶端元素函数

我们建立这个堆或者说维护这个优先级队列肯定是为了得到一个有价值的元素,所有这个堆里面最有价值的元素当然时堆顶元素,但是当我们得到堆顶元素时,这个堆也会被破坏,所以,我们一般会将堆顶元素和最后一个元素进行交换,然后再对堆顶元素进行向下调整,就让堆保持合适的规则

void removeTop()
{
    if (list.empty()) {
        throw std::out_of_range("Heap is empty");
    }
    swap(list[0], list[list.size() - 1]);
    siftDown(0);
    list.erase(list.end() - 1);
}

相关文章:

使用C++构建一个优先级队列

1.优先级队列的介绍 优先级队列是一种特殊的队列数据结构&#xff0c;它是队列&#xff0c;但又不完全是&#xff0c;因为它要将装载的数据进行优先级排序&#xff0c;找到一个最大或者最小优先级的元素&#xff0c;下一次出队列的元素就是这个元素&#xff0c;所以说它不完全是…...

linux驱动开发之字符设备与总线设备驱动模型的区别与联系

Linux驱动开发核心概念解析 1. 字符设备&#xff08;Character Device&#xff09; 定义与特点&#xff1a; 以字节流形式进行数据交换&#xff0c;适用于顺序访问的设备&#xff08;如键盘、鼠标、串口&#xff09;。 用户空间通过设备文件&#xff08;如/dev/xxx&#xff0…...

AI deepseek对数据治理的影响

DEEPSEEK作为智能一款助手&#xff0c;在数据治理体系中具有深远的影响。它通过提供智能化、自动化和高效化的解决方案&#xff0c;推动企业在数据治理变革与领域的优化。以下是EPSEEK对数据治理体系影响的多角度分析&#xff1a; 一、战略层面&#xff1a;推动数据治理目标的…...

DeepSeek各版本说明与优缺点分析

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列&#xff0c;其在不同版本的发布过程中&#xff0c;逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本&#xff0c;从版本的发布时间、特点、优势以及不足之处&#xff0…...

iOS 老项目适配 #Preview 预览功能

前言 iOS 开发者 最憋屈的就是UI 布局慢,一直以来没有实时预览功能,虽然swiftUI 早就支持了,但是目前主流还是使用UIKit在布局,iOS 17 苹果推出了 #Preview 可以支持UIKit 实时预览,但是仅仅是 iOS 17,老项目怎么办呢?于是就有了这篇 老项目适配 #Preview 预览 的文章,…...

在ubuntu22.04上先部署docker,再编译安装kamailio,附详细操作流程及docker和makailio的版本号

以下是在Ubuntu 22.04上部署Docker并编译安装Kamailio的详细操作流程&#xff0c;包含版本号信息&#xff1a; 一、部署Docker&#xff08;版本&#xff1a;24.0.7&#xff09; 更新系统包 sudo apt update && sudo apt upgrade -y安装依赖工具 sudo apt install -y ap…...

蓝桥杯试题:排序

一、问题描述 给定 nn 个正整数 a1,a2,…,ana1​,a2​,…,an​&#xff0c;你可以将它们任意排序。现要将这 nn 个数字连接成一排&#xff0c;即令相邻数字收尾相接&#xff0c;组成一个数。问&#xff0c;这个数最大可以是多少。 输入格式 第一行输入一个正整数 nn&#xff…...

C++常用拷贝和替换算法

算法简介&#xff1a; copy // 容器内指定的元素拷贝到另一容器replace // 将容器内指定范围的旧元素改为新元素replace_if // 容器内指定范围满足条件的元素替换为新元素swap //互换两个容器的元素 1. copy 功能描述&#xff1a; 将容器内指定范围的数据拷贝到另一容器中函…...

2024年12月 Scratch 图形化(三级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;三级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共18题&#xff0c;共50分) 第 1 题 气温和对应的穿衣建议如下表所示&#xff0c;下列选项能正确给出穿衣建议的是&#xff1f;&#xff08; &#xff09; A. …...

C# 中记录(Record)详解

从C#9.0开始&#xff0c;我们有了一个有趣的语法糖&#xff1a;记录(record)   为什么提供记录&#xff1f; 开发过程中&#xff0c;我们往往会创建一些简单的实体&#xff0c;它们仅仅拥有一些简单的属性&#xff0c;可能还有几个简单的方法&#xff0c;比如DTO等等&#xf…...

【MQTT协议 03】 抓包分析

一、MQTT测试工具 1、mqtt服务器 emqx 2、mqtt 客户端 mqttx 3、抓包工具 wireshark 搭建参考 【MQTT 协议 01】MQTT 服务器搭建_mqtt服务器搭建-CSDN博客 二、报文测试 2.1、CONNECT &#xff08;客户端连接&#xff09; 2.1.1、抓包 2.1.2、解析 #16进制表示 10300…...

深度学习-100-RAG技术之最简单的RAG系统概念和效果优化提升方向

文章目录 1 数据是基础2 Naive RAG(最简单的RAG系统)2.1 RAG周边技术2.2 标准的RAG流程2.3 RAG的潜在问题2.4 如何应对RAG的问题3 优化方向3.1 原始数据创建/准备3.1.1 易于理解的文本3.1.2 提高数据质量3.2 预检索优化3.2.1 分块优化3.2.2 添加元数据3.2.3 选对嵌入模型3.2.4 …...

Redis面试题总结(题目来源JavaGuide)

Redis 基础 问题1&#xff1a;Redis 有什么作用?为什么要用 Redis/为什么要用缓存&#xff1f; Redis 是一个开源的高性能键值对数据库&#xff0c;它的作用主要体现在以下几个方面&#xff1a; 缓存&#xff1a;Redis 常被用作缓存系统&#xff0c;可以将频繁访问的数据存储…...

Django 多数据库

django 支持项目连接多个数据库 DATABASES = {default: {ENGINE: django.db.backends.mysql,NAME: xxx,USER: root,"PASSWORD": xxxxx,HOST: xxxx,PORT: 3306,},bak: {ENGINE: django.db.backends.mysql,NAME: xxx,USER: root,"PASSWORD": xxxx,HOST: xxx…...

为AI聊天工具添加一个知识系统 之87 详细设计之28 Derivation 统一建模元模型 之1

文本要点 要点 Derivation 统一建模元模型 Derivation 统一建模元模型&#xff1a;意识原型的祖传代码&#xff0c;即支撑 程序框架的 符号学中的 自然和逻辑树。 这棵树的雏形中描述了三种建模工件&#xff1a;语用钩子&#xff0c;语法糖和语义胶水。 三种工件对应的三“…...

手机上运行AI大模型(Deepseek等)

最近deepseek的大火&#xff0c;让大家掀起新一波的本地部署运行大模型的热潮&#xff0c;特别是deepseek有蒸馏的小参数量版本&#xff0c;电脑上就相当方便了&#xff0c;直接ollamaopen-webui这种类似的组合就可以轻松地实现&#xff0c;只要硬件&#xff0c;如显存&#xf…...

电商项目-分布式事务(四)基于消息队列实现分布式事务

基于消息队列实现分布式事务&#xff0c;实现消息最终一致性 如何基于消息队列实现分布式事务&#xff1f; 通过消息队列实现分布式事务的话&#xff0c;可以保证当前数据的最终一致性。实现思路&#xff1a;将大的分布式事务&#xff0c;进行拆分&#xff0c;拆分成若干个小…...

leetcode_双指针 160.相交链表

160.相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 思路: 本题中&#xff0c;交点不是数值相等&#xff0c;而是指针相等 双指针遍历两遍后必定相遇&#xff0c…...

深入理解浮点数:单精度、双精度、半精度和BFloat16详解

文章目录 深入理解浮点数&#xff1a;单精度、双精度、半精度和BFloat16详解 &#x1f522;简介 &#x1f31f;1. 单精度&#xff08;Single Precision&#xff09;&#x1f3af;应用场景 &#x1f680; 2. 双精度&#xff08;Double Precision&#xff09;&#x1f4aa;应用场…...

Verilog基础(三):过程

过程(Procedures) - Always块 – 组合逻辑 (Always blocks – Combinational) 由于数字电路是由电线相连的逻辑门组成的,所以任何电路都可以表示为模块和赋值语句的某种组合. 然而,有时这不是描述电路最方便的方法. 两种always block是十分有用的: 组合逻辑: always @(…...

前端知识速记:POST和GET

前端知识速记&#xff1a;POST和GET请求的区别 一、GET请求概述 GET请求是一种用于获取服务器资源的请求方式。**使用GET请求时&#xff0c;数据通过URL传递&#xff0c;适合用于获取数据而不修改资源。**以下是GET请求的一些基本特征&#xff1a; 数据附在URL后面&#xff…...

【Java】MyBatis动态SQL

在MyBatis中使用动态SQL语句。 动态SQL是指根据参数数据动态组织SQL的技术。 生活中的案例&#xff1a; 在京东上买东西时&#xff0c;用户搜索商品&#xff0c;可以选择筛选条件&#xff0c;比如品牌&#xff0c;价格&#xff0c;材质等&#xff0c;也可以不使用筛选条件。这时…...

java进阶知识点

java回收机制 浅谈java中的反射 依赖注入的简单理解 通过接口的引用和构造方法的表达&#xff0c;将一些事情整好了反过来传给需要用到的地方~ 这样做得好处&#xff1a;做到了单一职责&#xff0c;并且提高了复用性&#xff0c;解耦了之后&#xff0c;任你如何实现&#xf…...

Java/Kotlin HashMap 等集合引发 ConcurrentModificationException

在对一些非并发集合同时进行读写的时候&#xff0c;会抛出 ConcurrentModificationException 异常产生示例 示例一&#xff08;单线程&#xff09;&#xff1a; 遍历集合时候去修改 抛出 ConcurrentModificationException 的主要原因是当你在遍历一个集合&#xff08;如 Map…...

拍照对比,X70 PRO与X90 PRO+的细节差异

以下是局部截图&#xff08;上X70P下X90PP&#xff09; 对比1 这里看不出差异。 对比2 X90PP的字明显更清楚。 对比3 中下的字&#xff0c;X90PP显然更清楚。...

Node.js与嵌入式开发:打破界限的创新结合

文章目录 一、Node.js的本质与核心优势1.1 什么是Node.js?1.2 嵌入式开发的范式转变二、Node.js与嵌入式结合的四大技术路径2.1 硬件交互层2.2 物联网协议栈2.3 边缘计算架构2.4 轻量化运行时方案三、实战案例:智能农业监测系统3.1 硬件配置3.2 软件架构3.3 核心代码片段四、…...

使用java调用deepseek,调用大模型,处理问题。ollama

废话不多&#xff0c;直接上代码 Testpublic void test7171111231233(){// url:放请求地址String url "http://localhost:11434/api/generate";HttpRequest request HttpUtil.createPost(url);Map<String, String> headers new HashMap<>();String a…...

Linux驱动---字符设备

目录 一、基础简介 1.1、Linux设备驱动分类 1.2、字符设备驱动概念 二、驱动基本构成 2.1、驱动模块的加载和卸载 2.2、添加LICENNSE以及其他信息 三、字符设备驱动开发步骤 3.1、分配主次设备号 3.1.1 主次设备号 3.1.2静态注册设备号 3.1.3动态注册设备号 3.1.4释…...

php7.3安装php7.3-gmp扩展踩坑总结

环境&#xff1a; 容器里面为php7.3.3版本 服务器也为php7.3.3-14版本&#xff0c;但是因为业务量太大需要在服务器里面跑脚本 容器里面为 alpine 系统&#xff0c;安装各种扩展 服务器里面开发服为 ubuntu 16.04.7 LTS (Xenial Xerus) 系统 服务器线上为 ubuntu 20.04.6 LTS (…...

javaEE-8.JVM(八股文系列)

目录 一.简介 二.JVM中的内存划分 JVM的内存划分图: 堆区:​编辑 栈区:​编辑 程序计数器&#xff1a;​编辑 元数据区&#xff1a;​编辑 经典笔试题&#xff1a; 三,JVM的类加载机制 1.加载: 2.验证: 3.准备: 4.解析: 5.初始化: 双亲委派模型 概念: JVM的类加…...