优先级队列---使用堆

使用进制堆的最小优先级队列算法(Java 实现) 最小优先级队列是一种常见的数据结构,它允许我们按照优先级顺序插入和删除元素。进制堆是一种树形数据结构,它类似于二叉堆,但每个节点有D个子节点,其中D是堆的进制数。通过这个实现,我们可以高效地管理具有优先级的元素,并根据其优先级进行插入和删除操作。接下来,我们创建一个最小优先级队列类(MinPriorityQueue),它包含以下基本操作:插入(insert)、删除最小元素(deleteMin)和获取最小元素(getMin)。在上面的示例代码中,我们创建了一个进制数为3的最小优先级队列,并插入了三个元素。 阅读详情
   优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权。
   一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 ,对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。
   由于优先级队列的性质,我们可以使用堆实现它:

代码:
Heap.hpp

#include<ostream>
using namespace std;
#include<vector>
#include<assert.h>

template<class T>
struct Less//小堆
{
    bool operator()(const T& left,const T& right)
    {
        return left<right;
    }   
};

template<class T>
struct Greater//大堆
{
    bool operator()(const T& left,const T& right)
    {
        return left>right;
    }   
};

template<class T,class Compare=Less<T>>
class Heap
{
public:
    Heap()
    {}
    Heap(const T array[],size_t size)
    {
        for(int idx=0;idx<size;++idx)
            _heap.push_back(array[idx]);
        int root=(_heap.size()-2)>>1;//找到倒数第一个非叶子结点·
        for(;root>=0;--root)
            _AdjustDown(root);
    }
    size_t Size()const
    {
        return _heap.size();
    }
    bool Empty()const
    {
        return _heap.empty();
    }
    size_t Top()const
    {
        return _heap[0];
    }
    void Insert(const T& data)
    {
        _heap.push_back(data);//直接插入到最后一个元素
        if(_heap.size()>1)//排成最小堆/最大堆
            _AdjustUp();
    }
    void Remove()//删除堆顶
    {
        assert(!_heap.empty());
        std::swap(_heap[0],_heap[_heap.size()-1]);//将堆顶与最后一个结点交换位置
        _heap.pop_back();//最后一个结点出堆,即原来的堆顶
        if(_heap.size()>1)
        {
            int root=(_heap.size()-2)>>1;//找到倒数第一个非叶子结点·
            for(;root>=0;--root)
            _AdjustDown(root);//将整个树排为最小堆/最大堆
        }
    }
protected:
    void _AdjustDown(size_t parent)
    {
        size_t child=parent*2+1;
        size_t size=_heap.size();
        while(child<size)
        {
            Compare com;
            if(child+1<size && com(_heap[child+1],_heap[child]))//左孩子>右孩子,将右孩子标记为孩子结点
                child+=1;
            if(Compare()(_heap[child],_heap[parent]))//孩子结点<小于双亲结点时,将两结点交换位置
            {
                std::swap(_heap[child],_heap[parent]);
                parent=child;
                child=parent*2+1;
            }
            else
                return;
        }
    }
    void _AdjustUp()//向上排成最小/大堆
    {
        size_t child=_heap.size()-1;
        size_t parent=(child-1)>>1;
        while(child!=0)
        {
            if(Compare()(_heap[child],_heap[parent]))
            {
                std::swap(_heap[child],_heap[parent]);
                child=parent;
                parent=(child-1)>>1;
            }
            else
                return;
        }
    }
private: 
    std::vector<T> _heap;
};

PriorityQueue.hpp

#include<ostream>
using namespace std;

template<class T, class Compare = Less<T>>
class PriorityQueue
{
public:
    PriorityQueue()
    {}

    PriorityQueue(const T array[],size_t size)
    {
        _hp=Heap<T,Compare>(array,size);
    }

    void Push(const T& data)
    {
        _hp.Insert(data);
    }
    void Pop()
    {
        _hp.Remove();
    }
    const T& Top()const
    {
        _hp.Top();
    }
    size_t Size()const
    {
        return _hp.Size();
    }

    bool Empty()const
    {
        return _hp.Empty();
    }

protected:
    Heap<T, Compare> _hp;
};

测试代码:

#include"Heap.hpp"
#include"PriorityQueue.hpp"

void Test()
{
    int array[]={12,8,3,53,22,77,19,32};
    PriorityQueue<int,Less<int>> q(array,sizeof(array)/sizeof(array[0]));
    q.Push(9);
    q.Pop();

}
int main()
{
    Test();
    return 0;
}
实现使用二进制堆的最小优先级队列算法 Java 最小优先级队列是一种常见的数据结构,它允许我们以按优先级排序的方式插入和删除元素。其中,二进制堆是一种常用的实现方式,它能够有效地支持插入和删除操作,并保持队列中的元素有序。通过以上代码示例,我们展示了如何使用二进制堆实现最小优先级队列算法,并且给出了一个简单实际问题的解决方案。在本篇文章中,我将以 Java 语言为例,展示如何使用二进制堆实现最小优先级队列算法。最后,我们使用循环从队列中删除并打印任务,直到队列为空。接口来比较任务的优先级,然后将任务插入最小优先级队列中。类,它包含任务的描述和优先级。 阅读详情

相关推荐

sap 标准委外和工序委外_SAP PP 工序委外详解

在SAP里有外包和外协两种:外包:指把原材料发出去,扣减库存,然后供应商加工生产,最后再作为成品入库。主要是在MM模块下实现的。对应的英语叫Subcontracting。外协:一般是指某种工序外协,在工艺路线里设置某个工序为外协后,系统自动会产生一个采购订单,一般是指采购某种服务。采购回来后再继续本公司的其他工序。主要是在PP模块下实现的。对应的英语叫Processing。2.当有委外加工的业务流...

weixin_26849971的博客 4578

浅谈算法和数据结构: 五 优先级队列与堆排序

在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue) 。 本文首先介绍优先级队列的定义...

weixin_33861800的博客 501

Python自动化神器:OP插件64位版从安装到实战(附雷电模拟器截图技巧)

本文详细介绍了Python自动化神器OP插件64位版的安装与实战应用,包括环境搭建、窗口控制、鼠标键盘模拟等核心功能。特别针对雷电模拟器提供了最小化截图技术和OCR识别优化方案,帮助开发者高效实现Windows自动化任务。

weixin_29094539的博客 330

使用 Swift 实现基于堆的优先级队列

作者:APPCODA EDITORIAL TEAM,原文链接,原文日期:2019-01-07 译者:Roc Zhang;校对:pmst,numbbbbb;定稿:Forelax 在计算机科学中,有很多问题可以通过将底层数据结构用优先级队列实现来改善算法的时间复杂度。其中 Dijkstra 的最短路径算法便是一个例子,该算法使用了优先级队列来在图中搜索两个顶点间的最短路径。 不幸的是,Swift ...

weixin_33691700的博客 290

用ST25DV芯片+KiCad快速设计NFC标签天线:参数计算/脚本生成/实测优化全流程

本文详细介绍了使用ST25DV芯片和KiCad工具设计NFC标签天线的全流程,包括参数计算、脚本生成和实测优化。通过解析芯片等效工作原理和设计思路,帮助开发者避开常见陷阱,实现高效、可量产的天线设计。文章还提供了Python计算工具和KiCad自动化脚本,大幅提升设计效率和成功率。

jj890的博客 756

避坑指南:你的VASP CI-NEB计算为什么不收敛?常见错误分析与解决思路

本文深入解析VASP CI-NEB计算不收敛的常见问题,提供从结构准备到参数设置的系统解决方案。针对过渡态计算中的能量曲线异常、中间图像偏离等典型问题,详细介绍了诊断方法和实用工具,帮助研究者高效解决CI-NEB收敛难题,提升计算效率。

weixin_29698641的博客 431

【Java】实现堆,并使用堆模拟优先级队列

学习目标: 目标:熟练运用Java所学知识 学习内容: 本文内容:实现堆,并使用堆模拟优先级队列 文章目录学习目标:学习内容:

zhangxxin的博客 162

夸克缓存视频合并小工具

原理 使用windows的命令行的copy命令来合并 copy /b 0+1+2+3 new.ts 分析缓存目录结构,发现都是一个m3u8文件带一个同名文件夹 所以分析m3u8并把原来的路径换成这个缓存文件夹路径并按顺序合并即可。 其中碰到的难点是Qprocess在windows不好使,索性直接存成.bat批处理文件再执行 还有就是中文问题,具体在代码里都说了。 代码 (环境Qt5.7.0) 这是mainwindow.h #ifndef MAINWINDOW_H #defin.

natural_Caduceus 1万+

java堆和优先级队列PriorityQueue的使用及实现

在谈优先级队列之前先简单说一下堆的概念。 堆(heap) 一、概念 1.堆在逻辑上是一棵完全二叉树 2.物理上是保存在数组中 3.满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆 4.反之,则是小堆,或者小根堆,或者最小堆 5.堆的基本作用是,快速找集合中的最值 二、大小根堆的建立向下调整实现 调整过程: 1.判断 index 位置有没有孩子 1)index 如果已经是叶子...

丸啊~ 1219

大模型量化方法总结

本文主要对大模型量化方法进行了总结,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 模型精度 3. 量化方法 3.1 方法一 3.2 方法二 3.3 方法三

herosunly的博客 1万+

YOLOv12改进前必看 - YAML模型配置文件详细解读(再也不用担心通道数不匹配) 附网络结构图

YOLOv12的模型配置文件在中,里面包含yolov12的以及的不同大小的模型,本文将详细介绍一下YOLOv12模型文件中各参数的含义。

Limiiiing的博客 3275

Java-数据结构-优先级队列(堆的使用)

本篇文章主要讲解"优先级队列"与"堆"的应用,希望能给大家带来帮助。

爱是小小的癌的博客 1830

错误代码:11300001 数据集 [xxx] 配置错误“=”附近有语法错误(原理分析)

错误代码:11300001 数据集 [1_Workshift] 配置错误“=”附近有语法错误。

码农研究僧的博客 914

使用最小堆使用优先级队列(c语言版本)

下面的例子来自Weiss的《数据结构与算法分析:c语言描述》,自己亲自敲了一遍,跑了个demo,并将结果记录下来。 binheap.h的头文件声明 //description: 使最小堆实现优先级队列 //date: 2019-03-15 #ifndef __BINHEAP_H__ #define __BINHEAP_H__ typedef int ElementType; struc...

雪峰流云 817

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java~堆(heap)的基本概念、操作及实现、优先级队列、PriorityQueue 的使用、堆排序

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!ava获取)**

2401_84408337的博客 1018

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

堆和PriorityQueue优先级队列的创建与使用

介绍了如何实现堆以及优先级的队列的性质

qq_56320180的博客 248

使用堆数据结构在python中实现优先级队列

优先级队列是一种与普通队列或堆栈相似的数据结构,但是每个元素都具有关联的优先级。 高优先级的元素先于低优先级的元素提供。 优先级队列通常使用堆数据结构来实现。 在本文中,我们将讨论使用堆数据结构在python中实现优先级队列的方法。 让我们开始吧! 在构建" PriorityQueue"类之前,值得熟悉python" heapq"模块。 首先,我们导入&qu...

wulishinian的博客 925

C++ queue的以及优先级队列(堆)的介绍和使用

C++ queue的以及优先级队列(堆)的介绍和使用

weixin_59215611的博客 853

优先级队列 c语言,使用最小堆使用优先级队列(c语言版本)

下面的例子来自Weiss的《数据结构与算法分析:c语言描述》,自己亲自敲了一遍,跑了个demo,并将结果记录下来。binheap.h的头文件声明//description: 使最小堆实现优先级队列//date: 2019-03-15#ifndef __BINHEAP_H__#define __BINHEAP_H__typedef int ElementType;struct HeapStruct ...

weixin_31641077的博客 358

最小优先级队列 — 使用最小堆实现

最小优先级支持的操作: 1.INSERT(S,x):将元素x插入队列S 2.MINIMUM(S):返回S中最小的元素 3.EXTRACT_MIN(S):去掉并返回S中最小的元素 4.DECREASE_KEY(S,x,key):将下标为x的元素值降低为key   使用最

gls_liujia的专栏 5251

堆的使用(优先级队列)

文章目录一、二叉树的顺序存储二、堆1、什么是堆?2、向下调整和创建堆3、应用 一、二叉树的顺序存储 使用数组保存二叉树结构,方式,即将二叉树用层序遍历的方式放入数组中。一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。这种方式的主要用法就是堆的表示。 堆主要用到已知父节点,判断子节点位置,父节点和子节点下标关系: 已知父节点下标i,左孩子下标2i+1;右孩子下标2i+2; 已知孩子(不区分左右)下标j,父节点下标(j-1)/2; 二、堆 1、什么是堆? 堆逻辑上是一棵完全二叉树,物理上是保..

a13572259715的博客 384

【C++优先级队列priority_queue基础】基本使用,模拟实现,堆

朋友们好,这篇博客我们继续C++的初阶学习,最近我学习了C++中的STL库中的优先级队列(priority_queue)容器适配器,对于优先级队列,我们不仅要会使用常用的函数接口,我们还有明白这些接口在其底层是如何实现的。所以特意整理出来一篇博客供我们学习和,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!......

qq_43727529的博客 1095

优先级队列(使用堆进行封装)

优先级队列 优先队列是一种数据结构,能够保证每次出队的是队列中优先级最高的元素(可以自己定义比较器),使用堆的堆顶元素维护这个优先级最高的元素,因为堆具有堆序性,堆顶元素要么是最小的,要么是最大的。 代码实现 使用到的堆 //PriorityQueue.h #include &quot;Heap.h&quot; typedef struct PriorityQueue { Heap _hp; }P...

玩世不恭的博客 668

移动开发 | 使用 Swift 实现基于堆的优先级队列

计算机科学中,有很多问题可以通过将底层数据结构用优先级队列实现来改善算法的时间复杂度。其中 Dijkstra 的最短路径算法便是一个例子,该算法使用了优先级队列来在图中搜...

极光开发者 235

使用快排一次划分求第k小、使用优先级队列、使用堆

快排 #include <iostream> using namespace std; /************************************** * * Partition() 快排的一次划分函数 * */ // 把小的插入头部位置,可用于链表 int Partition(int* ar, int left, int right) { int i = left - 1, j = left; int tmp = ar[j]; while (j <= ri

专注于C/C++/Linux领域创作 255

python 优先队列_使用堆的优先级队列

优先级队列是一种队列,其中每个元素都有一个与之关联的密钥,并且队列根据这些密钥返回元素,这与以先到先服务为基础的传统队列不同。因此,最大优先级队列首先返回具有最大密钥的元素,而最小优先级队列首先返回具有最小密钥的元素。优先级队列用于许多算法,如霍夫曼码,普里姆算法等。它还用于计算机的调度过程等。堆非常适合实现优先级队列,因为树的根最大和最小元素分别用于最大堆和最小堆。我们对最大优先级队列使用max...

weixin_39942351的博客 485
上一篇: 模拟实现队列
下一篇: 哈夫曼树Huffmantree
出走刺猬
博客等级 码龄10年 12粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值