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

news2024/11/24 20:30:27

文章目录

  • 一、定义
  • 二、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.coloradmin.cn/o/1943585.html

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

相关文章

自用:磁传感器数据解算

协议格式&#xff1a; 详细计算磁场如下&#xff1a; 3字节数据的格式为有符号整型数&#xff0c;数据为补码格式&#xff0c;最高位为符号位。需要先将补码格式的数据转化为10进制的实际值&#xff0c;方法如下&#xff1a; 当数据小于时为正数&#xff0c;实际值为本身&…

Mac中maven配置安装路径

Mac中maven配置安装路径 没有下载maven的可以先下载&#xff1a;&#xff08;这里建议maven版本不要下高了&#xff09; 如果你的bash_profile中没有配置JAVA_HOME路径&#xff0c;可以按照下面的命令配置一下 获取JAVA的安装路径&#xff1a; /usr/libexec/java_home -V …

Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档

什么是 Swagger ? Swagger 是一组围绕 OpenAPI 规范构建的开源工具&#xff0c;可以帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具 包括&#xff1a; Swagger Editor&#xff1a;基于浏览器的编辑器&#xff0c;您可以在其中编写 OpenAPI 定义Swagger UI&…

NSSCTF[堆][tcache]

1. [CISCN 2021 初赛]lonelywolf 题目地址&#xff1a;[CISCN 2021 初赛]lonelywolf | NSSCTF 思路&#xff1a; 修开tcache结构&#xff0c;伪造一个0x91的chunk&#xff0c;伪造0x91chunk的数量&#xff08;填满tcache&#xff09;&#xff0c;再将其释放free进入unsortedb…

Linux中,MySQL数据库基础

21 世纪&#xff0c;人类迈入了“信息爆炸时代”&#xff0c;大量的数据、信息在不断产生&#xff0c;伴随而来的就是如何安全、有效地存储、检索和管理它们。对数据的有效存储、高效访问、方便共享和安全控制已经成为信息时代亟待解决的问题。 数据库简介 使用数据库的必要性…

MATLAB--文件操作相关指令

文章目录 文件操作相关指令前言 M文件创建MATLAB文件操作指令MATLAB文件流控制 文件操作相关指令 前言 记录一下M文件创建、操作、获取信息等相关资料。   MATLAB的M文件是用来代替MATLAB命令行窗口输入指令的文件。因此所有的MATLAB指令都可以再MATLAB的M文件中调用. M文件…

算法力扣刷题记录 五十七【236. 二叉树的最近公共祖先】和【235. 二叉搜索树的最近公共祖先】

前言 公共祖先解决。二叉树和二叉搜索树条件下的最近公共祖先。 二叉树篇继续。 一、【236. 二叉树的最近公共祖先】题目阅读 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff…

Spring Bean介绍

目录 1.什么是bean 2.获取bean 3.bean的作用域 4.第三方bean 5.Bean的生命周期 6.Bean的种类 7.为什么使用Bean&#xff1f; 1.什么是bean Bean是Java世界中的一种组件&#xff0c;用于封装数据和逻辑&#xff0c;以便在应用程序中重用和维护。它不仅可以装在数据&#x…

Redis哨兵模式实践

本次环境为Centos7.6&#xff0c;redis-7.0.4 1&#xff1a;主备模式&#xff1a;即主节点的数据自动同步到从节点&#xff0c;但当主节点挂了&#xff0c;从节点需要手动设置为主节点&#xff0c;比较麻烦。 2&#xff1a;哨兵模式&#xff1a;当主节点挂了&#xff0c;自动投…

PCL-基于SAC_IA和NDT结合的点云配准算法

一、原理概述1.点云配准流程图2.快速点特征直方图FPFH3.采样一致性SAC_IA粗配准4.正态分布变换NDT精配准 二、实验代码三、实验结果四、总结五、参考 一、原理概述 1.点云配准流程图 2.快速点特征直方图FPFH 快速点特征直方图&#xff08;Fast Point Feature Histogram&#…

Oracle SQL:了解执行计划和性能调优

查询优化类似于制作完美食谱的艺术——它需要对成分&#xff08;数据&#xff09;、厨房&#xff08;数据库系统&#xff09;和使用的技术&#xff08;查询优化器&#xff09;有深入的了解。每个数据库系统都有自己的处理和运行 SQL 查询的方式&#xff0c;“解释”计划向我们展…

Mysql注意事项(一)

Mysql注意事项&#xff08;一&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常&#xff0c;除非你确定需要表中的每个列&am…

每日刷题记录(codetop版)

7.21 7.22 7.23 复习7.21和7.22

每日OJ_牛客DD1 连续最大和

目录 牛客DD1 连续最大和 解析代码 牛客DD1 连续最大和 连续最大和_牛客题霸_牛客网 解析代码 本题是一个经典的动规问题&#xff0c;简称dp问题&#xff0c;但这个问题是非常简单的dp问题&#xff0c;而且经常会考察&#xff0c;所以一定要把这个题做会。本题题意很简单&am…

探寻安全新时代:叉车AI智能影像防撞系统,守护生命之光

在繁忙的工业现场&#xff0c;叉车司机常常面临着视线受阻的困境&#xff0c;那些被货物遮挡的盲区&#xff0c;仿佛隐藏着无法预知的危险。然而&#xff0c;这样的隐患在一次惨痛的事故中暴露无遗&#xff0c;一名无辜的行人因叉车司机的视线受阻而不幸被撞身亡。这起悲剧让我…

机械设计基础B(学习笔记)

绪论 机构&#xff1a;是一些具备各自特点的和具有确定的相对运动的基本组合的统称。 组成机构的各个相对运动部分称为构件。构件作为运动单元&#xff0c;它可以是单一的整体&#xff0c;也可以是由几个最基本的事物&#xff08;通常称为零件&#xff09;组成的刚性结构。 构件…

python·数据分析基础知识

numpy 一个数值计算包 python列表与numpy矩阵区别 python中修改列表元素和列表相加 for循环 &#xff1a;[x1 for x in a] 多个元素需要用zip捆绑&#xff1a;[xy for(x,y) in zip(a,b)] numpy矩阵自动进行相应元素计算 np.array()1各元素1 ab各元素相加 a*b矩阵相乘或者是…

爬虫学习4:爬取王者荣耀技能信息

爬虫&#xff1a;爬取王者荣耀技能信息&#xff08;代码和代码流程&#xff09; 代码 # 王者荣耀英雄信息获取 import time from selenium import webdriver from selenium.webdriver.common.by import By if __name__ __main__:fp open("./honorKing.txt", "…

C++的UI框架和开源项目介绍

文章目录 1.QT2.wxWidgets3.Dear ImGui 1.QT QT的开源项目&#xff1a;QGIS&#xff08;地理信息系统&#xff09; https://github.com/qgis/QGIS?tabreadme-ov-file 2.wxWidgets wxWidgets的开源项目&#xff1a;filezilla https://svn.filezilla-project.org/svn/ wxWidg…

Matplotlib折线图绘制秘籍:让你的数据线条比过山车还刺激!

1. Matplotlib_折线图 折线图&#xff08;line chart&#xff09;是我们日常工作中经常使用的一种图表&#xff0c;它可以直观的反应数据的变化趋势 # 导包 import numpy as np import pandas as pd import matplotlib.pyplot as plt# 如果浏览器不显示图片&#xff0c;就需要…