数据结构C++——优先队列

文章目录

  • 一、定义
  • 二、ADT
  • 三、优先队列的描述
    • 3.1 线性表
    • 3.2 堆
      • 3.2.1 最大堆的ADT
      • 3.2.2 最大堆的插入
      • 3.2.3 最大堆的删除
      • 3.2.4 最大堆的初始化
    • 3.3 左高树 LT
      • 3.3.1 高度优先左高树HBLT
      • 3.3.2 重量优先左高树WBLT
      • 3.3.3 最大HBLT的插入
      • 3.3.4 最大HBLT的删除
      • 3.3.5 合并两棵最大HBLT
      • 3.3.6 初始化最大HBLT
  • 四、应用
    • 4.1 堆排序
    • 4.2 霍夫曼编码

一、定义

优先级队列(priority queue):

  • 0个或多个元素的集合
  • 每个元素都有一个优先级或值
  • 与FIFO结构的队列不同,优先级队列中元素出队列的顺序由元素的优先级决定。
  • 从优先级队列中删除元素是根据优先级高或低的次序,而不是元素进入队列的次序.
  • 优先级队列中的元素可以有相同的优先级

对优先级队列执行的操作有:

  • 查找一个元素(top)
  • 插入一个新元素(push)
  • 删除一个元素(pop)

两种优先级队列:

  • 最小优先级队列:“查找/删除” 操作用来“查找/删除”优先级最小的元素
  • 最大优先级队列:“查找/删除”操作用来“查找/删除”优先级最大的元素

二、ADT

实例:

  • 有限个元素集合
  • 每个元素都有一个优先级

操作(以最大优先级队列为例):

  • empty():判断优先级队列是否为空,为空时返回true
  • Size():返回队列中的元素数目
  • top():返回优先级最大的元素
  • pop():删除优先级最大的元素
  • push(x):插入元素x

三、优先队列的描述

3 种描述方法:

  • 线性表
  • 左高树

3.1 线性表

采用无序线性表来描述最大优先级队列

  • 数组描述(利用公式Location(i)=i-1)
    插入:表的右端末尾执行,时间: Θ ( 1 ) \Theta(1) Θ(1) ;
    删除: 查找优先级最大的元素,时间: Θ ( n ) \Theta(n) Θ(n);
  • 链表描述
    插入:在链头执行,时间: Θ ( 1 ) \Theta(1) Θ(1);
    删除: 查找优先级最大的元素, Θ ( n ) \Theta(n) Θ(n) ;

采用有序线性表描述最大优先级队列

  • 数组描述(利用公式Location(i)=i-1),元素按递增次序排列)
    插入:先查找插入元素的位置,时间: O(n) ;
    删除: 删除最右元素,时间: Θ ( 1 ) \Theta(1) Θ(1) ;
  • 链表描述(按递减次序排列)
    插入:先查找插入元素的位置,时间: O(n) ;
    删除: 表头删除,时间: Θ ( 1 ) \Theta(1) Θ(1) ;

3.2 堆

大/小根树

  • 每个节点的值都大于(小于)或等于其子节点(如果有的话)值的树
  • 大根树(max tree):又称最大树
  • 小根树(min tree):又称最小树
  • 大根树或小根树节点的子节点个数可以大于2

在这里插入图片描述

大根堆/小根堆

  • 既是大根树(小根树),又是完全二叉树
  • 大根堆(max heap):又称最大堆
  • 小根堆(min heap):又称最小堆

堆是完全二叉树,可用一维数组有效地描述堆。
关于完全二叉树,见本系列数据结构C++——二叉树和树

在这里插入图片描述

3.2.1 最大堆的ADT

数据成员:

  • T *heap; // 元素数组
  • int arrayLength; //数组的容量
  • int heapSize; //堆中的元素个数

方法:

  • empty():判断heapSize是否为0
  • Size():返回heapSize的值
  • top():如果 堆为空(heapSize==0),抛出异常queueEmpty;否则返回 heap[1](heap[0]未使用)
  • pop()
  • push(x)

重点:插入push、删除pop

3.2.2 最大堆的插入

流程:

  • 作为叶子节点插入最大堆
  • 与其父节点比较,若新插入节点更大,则两者交换(实际只是将父节点的值向下移)。否则该位置就是合法的,插入结束。
  • 若发生交换,则重复这个过程,直到位置合法/交换为根节点

在这里插入图片描述

代码实现:

template<class T>
maxHeap<T>& maxHeap<T>::push(const T& theElement)
{// 把theElement 插入到大根堆中if  (heapSize = = arrayLength-1) // 没有足够空间……//数组长度加倍//为theElement寻找应插入位置// currentNode 从新的叶节点开始,并沿着树上升int  currentNode = ++heapSize;while (currentNode != 1 && theElement > heap[currentNode/2]){//不能够把theElement放入heap[currentNode]heap[currentNode] = heap[currentNode/2]; // 将元素下移currentNode /= 2; // 移向父节点}heap[currentNode] = theElement;}

插入的时间复杂度:

  • 插入的时间复杂性.
    每一层的工作,耗时: Θ ( 1 ) \Theta(1) Θ(1)
  • 实现插入策略的时间复杂性:
    O ( h e i g h t ) = O ( l o g 2 n ) O(height) = O(log_2n) O(height)=O(log2n) (n 是堆的大小)

3.2.3 最大堆的删除

流程:

  • 删除heap[1]
  • 将最后一个元素heap[heapsize–]放到heap[1]的位置
  • 显然,此时不满足最大堆的性质
  • 因此,需要重新调整最大堆

调整为最大堆:

  • current初始化为1,指向根的位置,表示被替换的空位置
  • child 初始化为2,指向current的左孩子
  • lastElemet = 原来最大堆的最后一个元素
  • 循环判断:

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

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

相关文章

【Linux】yum的认识与简单配置

今天来初步认识一下yum——Linux下软件包管理器。 既然说到Linux下软件包管理器&#xff0c;那我们不妨来先谈论一下什么是软件包的概念。 1. 什么是软件包&#xff1f; 软件的下载需要源代码编译链接之后生成可执行文件进行运行。无论是Windows系统下还是Linux系统下&#x…

QT总结——图标显示坑

最近写代码遇到一个神仙大坑&#xff0c;我都怀疑我软件是不是坏了&#xff0c;这里记录一下。 写qt工程的时候我们一般会设置图标&#xff0c;这个图标是窗体的图标同时也是任务栏的图标&#xff0c;但是我发现生成的exe没有图标&#xff0c;这个时候就想着给他加一个图标&…

AI学习记录 - 激活函数的作用

试验&#xff0c;通过在线性公式加入激活函数&#xff0c;可以拟合复杂的情况&#xff08;使用react实现&#xff0c;原创&#xff09; 结论:1、线性函数的叠加&#xff0c;无论叠加多少次&#xff0c;都是线性的 如下图 示例代码 线性代码&#xff0c;使用ykxb的方式&…

【BUG】已解决:ValueError: All arrays must be of the same length

ValueError: All arrays must be of the same length 目录 ValueError: All arrays must be of the same length 【常见模块错误】 【解决方案】 问题原因 解决方法 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&…

Python爬虫实战案例(爬取图片)

爬取图片的信息 爬取图片与爬取文本内容相似&#xff0c;只是需要加上图片的url&#xff0c;并且在查找图片位置的时候需要带上图片的属性。 这里选取了一个4K高清的壁纸网站&#xff08;彼岸壁纸https://pic.netbian.com&#xff09;进行爬取。 具体步骤如下&#xff1a; …

[Python][Python入门]详细讲解

目录 0.铺垫1.常量和表达式2.变量3.变量的类型1.整数2.浮点数3.字符串4.布尔 4.动态类型特性5.注释∞.积累 0.铺垫 Python中&#xff0c;一个语句写完了之后&#xff0c;可以加上分号&#xff0c;也可以不加 通常情况下都是不加的&#xff0c;如果加了&#xff0c;也不算错如果…

Ubuntu-文件管理器中鼠标右键添加文本文件

文件管理器中鼠标右键添加文本文件 一、概述二、步骤 一、概述 Ubuntu在文管右键发现没有创建文本文件的菜单&#xff0c; 期望如下所示&#xff0c;这样的操作非常简单 二、步骤 找到模板文件夹 在模板文件夹&#xff0c;创建自己想要的文件就好啦 这个也是支持放文件夹去…

【C++】学习笔记——哈希_1

文章目录 十八、哈希1. unordered系列关联式容器2. 底层结构哈希函数哈希冲突 未完待续 十八、哈希 1. unordered系列关联式容器 在C11中&#xff0c;STL又提供了4个unordered系列的关联式容器&#xff0c;这四个容器与红黑树结构的关联式容器使用方式基本类似&#xff0c;只…

Linux云计算 |【第二阶段】AUTOMATION-DAY1

主要内容&#xff1a; 版本控制&#xff08;集中式、分布式&#xff09;、Git基础&#xff08;服务端、客户端部署&#xff0c;基础命令操作、文档版本管理&#xff09;、Git进阶&#xff08;数据恢复、分支、冲突管理&#xff09; 一、版本控制概念 版本控制是一种记录文件变…

iterm2工具的使用|MAC电脑终端实现分屏|iterm2开启滚动操作

iterm2 工具概括 iTerm2 是一款非常强大的终端工具。 iTerm2 最初是为 macOS 开发的,但也有 Windows 、Linux 发行版&#xff08;Ubuntu、centos…&#xff09;可用。 应用场景 Mac操作系统中想实现终端分屏 iterm2 工具特点 多标签和分屏: 可以在同一个窗口中打开多个标签…

C基础(学习)2024.7.23

Linux基本命令&#xff0c;vi编译器的使用&#xff0c;简单的编程步骤&#xff0c;程序语言&#xff0c;gcc编译器编译过程&#xff0c;进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC 数值表示&#xff0c;词法符号&#xff0c;变量&#xff0c;常量相关知识可以查看…

.mp4格式的视频为何不能通过video标签在chrome浏览器中播放?

chrome浏览器目前只支持编解码格式为H264格式的视频&#xff0c;如果某个.mp4后缀的视频不能在chrome浏览器中播放&#xff0c;多半是这个视频的编码格式不是H264的&#xff01; 1、可以通过ffmpeg工具查看当前视频的编码格式&#xff1a; ffprobe -v error -select_streams v…

JS_plus.key.addEventListener监听键盘按键

官方文档&#xff1a;https://www.html5plus.org/doc/zh_cn/key.html 监听事件 plus.key.addEventListener(keydown, e > {console.log("keydown: "e.keyCode) }) plus.key.addEventListener(keyup, e > {console.log("keyup: "e.keyCode) })移除事…

arcgis api for js4.x实现点击GraphicsLayer上绘制的Graphic获取Graphic中的attributes中的信息

需求&#xff1a;arcgis api for js4.x 在Map地图中添加GraphicsLayer图层&#xff0c;在GraphicsLayer图层添加绘制graphics点&#xff0c;点击绘制的点&#xff0c;获取graphics点中的attributes中的信息 var cityCenter new Point(116, 36, new SpatialReference({ wkid: …

leetcode日记(48)排列序列

这道题想到了规律就不算难&#xff0c;列了好几个示例想出的规律&#xff0c;试着排序几个就会了 class Solution { public:string getPermutation(int n, int k) {string result;int m1;int i1;for(i;i<n;i) m*i;i--;int pm/i;string s;for(int j0;j<n;j) s.append(to_…

Vue 3 和 SpringBoot 实现文件分片上传示例

前端实现&#xff08;Vue 3和vue-upload-component&#xff09; 安装 vue-upload-component&#xff1a; npm install vue-upload-component --save创建一个Vue组件用于上传文件&#xff08;FileUploader.vue&#xff09;&#xff1a; <template><div><file-…

基于VUE的软件项目开发管理系统/项目管理系统/软件开发过程管理系统的设计与实现

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括软件项目开发管理系统的网络应用&#xff0c;在外国软件项目开发管理系统已经是很普遍的方式&#xff0c;不过国内的软件项目开发管理可能还处于起步阶段。软件项目开发…

【计算机网络】三次握手、四次挥手

问&#xff1a;三次握手 四次挥手 TCP 连接过程是 3 次握手&#xff0c;终止过程是 4 次挥手 3次握手 第一步&#xff1a;客户端向服务器发送一个带有 SYN&#xff08;同步&#xff09;标志的包&#xff0c;指示客户端要建立连接。 第二步&#xff1a;服务器收到客户端的请求…

【ffmpeg命令基础】视频选项讲解

文章目录 前言设置输出文件的帧数设置每秒播放的帧数设置输出视频的帧率示例1&#xff1a;更改输出视频的帧率示例2&#xff1a;将图像序列转换为视频 设置输入视频的帧率示例3&#xff1a;处理高帧率视频示例4&#xff1a;处理低帧率视频 同时设置输入和输出帧率示例5&#xf…

QtCreator和QtDesignStudio最佳实践

一、QTC和QDS工作流概述 很多初学者对 QDS(Qt Design Studio) 和 QTC(Qt Creator)如何配合经常存有疑问&#xff0c;本文介绍具体的工作流程。 工作流程 1.产品设计&#xff1a;通过PS、Figma、XD等专业工具设计页面视觉和原型。 2.QDS 原型制作&#xff1a;导入设计源文件、…