数据结构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.xdnf.cn/news/1486648.html

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

相关文章

京东商品详情API返回值:商品ID与标题解析

京东商品详情API是京东电商平台提供的一个接口&#xff0c;用于获取商品的详细信息&#xff0c;包括商品ID、商品标题、价格、库存等。然而&#xff0c;需要注意的是&#xff0c;直接访问和使用京东的商品详情API通常需要符合京东的开放平台规则&#xff0c;并可能需要注册成为…

OpenCV 卷积操作 均值,高斯,中值滤波 图片降噪

文章目录 卷积概念卷积的作用1. 图像平滑与去噪2. 边缘检测3. 特征提取4. 图像增强 常见的三种滤波均值滤波均值滤波的步骤优点和缺点使用示例 高斯滤波示例代码 中值滤波中值滤波的基本原理数学表达式中值滤波的步骤示例优点和缺点使用示例 三种滤波 图片降噪 Python实现 卷积…

redis高可用之主从复制、哨兵以及Cluster集群

目录 一、Redis主从复制 1&#xff09;主从复制的作用 2&#xff09;主从复制流程 3&#xff09;搭建Redis主从复制 1、部署redis服务器 2、修改Redis配置文件&#xff08;所有节点操作&#xff09; 3、验证主从复制结果 二、哨兵模式 1&#xff09;哨兵的作用 2&…

设计模式-领域逻辑模式-SQL的分离

尽管SQL已经在商业软件中广泛应用&#xff0c;但它在使用中还存在一定缺陷 许多应用程序开发者不能充分理解SQL&#xff0c;同时很多习惯用SQL的开发人员又可能组织不好程序代码。尽管现在有很多技术可以把SQL封装在程序里&#xff0c;但大多封装的还很牵强。 SQL分离的思路&…

谷粒商城实战笔记-46-商品服务-API-三级分类-配置网关路由与路径重写

文章目录 一&#xff0c;准备工作1&#xff0c;新增一级菜单2&#xff0c;新增二级菜单 二&#xff0c;前端树形界面开发1&#xff0c;开发分类展示组件 三&#xff0c;远程调用接口获取商品分类数据1&#xff0c;远程调用2&#xff0c;路由配置 错误记录 本节的主要内容&#…

Cisco ISR 2代路由器,1900,2900,3900系列RTU License使用方法

1 情况说明 客户处的2台Cisco 2911要开启ip sla ,但发现无法支持&#xff0c;查询得知需要有data license才可以。可以通过开启RTU license激活。开启RTU后正常. 2 操作方法 License种类如下&#xff1a;  ipbase ipbasek9 Permanent ipbasek9  security securityk9 Eva…

C++【new delete】【operator new operator delete】

目录 数据段存储位置的小复习 new 和 delete operator new 和 operator delete new和delete调用operator new和operator delete new [ ] 和 delete [ ]的原理 数据段存储位置的小复习 全局变量和静态变量都在静态区&#xff0c;也称数据段 全局变量int x 0 和 全局静态变…

全网最实用--神经网络各个组件以及效率指标 (含代码助理解,粘贴即用)

文章目录 一、神经网络相关组件0.前奏1.全连接层&#xff08;Fully Connected Layer, FC&#xff09;/密集层&#xff08;Dense Layer&#xff09;:2.卷积层&#xff08;Convolutional Layer, Conv&#xff09;:a.一维卷积b.二维卷积c.分组卷积 3.池化层&#xff08;Pooling La…

JavaWeb系列二十三: web 应用常用功能(文件上传下载)

文件上传下载 基本介绍文件上传基本原理文件上传应用实例文件上传注意事项和细节 文件下载基本原理文件下载应用实例文件下载注意事项 ⬅️ 上一篇: JavaWeb系列二十二: 线程数据共享和安全(ThreadLocal) &#x1f389; 欢迎来到 JavaWeb系列二十三: web 应用常用功能(文件上传…

数据结构:基础概念

一、相关概念 概念 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff1a;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff1a;数据和数据之间是一对一的关系 树&#xff1a; 一对多 图&#xff1a;多对多 物理结构(在内存当中的存储关系)…

堆的相关特点

一.建堆的两种方法 给定一个数组&#xff0c;其中数组里面的元素个数是n个如何能够把这个数组建立成为一个堆&#xff0c;今天探讨两种方法&#xff0c;分别是向上调整法和向下调整法&#xff0c;分别探讨他们的时间复杂度 向上调整法&#xff08;以小堆为例&#xff09; 回…

Spring系列-04-事件机制,监听器,模块/条件装配

事件机制&监听器 SpringFramework中设计的观察者模式-掌握 SpringFramework 中, 体现观察者模式的特性就是事件驱动和监听器。监听器充当订阅者, 监听特定的事件&#xff1b;事件源充当被观察的主题, 用来发布事件&#xff1b;IOC 容器本身也是事件广播器, 可以理解成观察…

create-vue源码学习之 gradient-string 渐变色打印

效果 在使用 create-vue 脚手架时&#xff0c;想实现如下的打印效果。 探究过程 翻到源码里看到这一行 没错&#xff0c;绿色部分就是告诉我们如何生成的。可以看到引入了 gradient-string 包 于是乎&#xff0c;我来试试 pnpm i gradient-string pnpm i --save-dev …

1.4、存储系统

目录 存储器的层次结构外存&#xff08;辅存&#xff09;内存CPU的寄存器Cache总结举例局部性原理 练习题 高速缓存Cache总结举例总结 练习题 Cache的地址映像方法直接相联映像全相联映像组相联映像练习题 Cache替换算法Cache页面淘汰算法Cache的读写过程练习题 磁盘总结固态硬…

人工智能(AI)在办公场所的广泛应用

人工智能&#xff08;AI&#xff09;在办公场所的广泛应用正逐步改变着我们的工作方式和效率。随着技术的进步&#xff0c;越来越多的公司和组织开始采用各种AI技术来优化工作流程、提升生产力&#xff0c;并提供更好的用户体验。以下是人工智能在办公方面的一些主要作用和影响…

Ecovadis评估的流程是什么

Ecovadis评估流程是一个全面、系统且注重细节的过程&#xff0c;旨在为企业提供关于其可持续性表现的深入洞察。这一评估不仅覆盖了企业在环境、社会和治理方面的多个方面&#xff0c;还强调了持续改进的重要性&#xff0c;确保企业能够不断提升其CSR&#xff08;企业社会责任&…

社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍

系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料&#xff0c;加入兴趣围子&#xff0c;通过文字、图片、语音、视频等多种方式进行交流&#xff0c;满足用户在不同场景下的社交需求 核心功能 -&#xff0c;…

Window系统下MySQL安装教程

1、MySQL各版本介绍 MySQL Community Edition MySQL Community Edition 是MySQL官方发布的免费版本&#xff0c;适用于个人用户和小型团队使用。它包含了基本的数据库功能&#xff0c;如创建表、插入数据、查询数据等。 MySQL Enterprise Edition MySQL Enterprise Edition 是…

【数据结构】AVL树(图文解析 + 代码实现)

目录 1、AVL树的概念 2、AVL树结点的定义 3、AVL树的插入 4、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 右左双旋 4.4 左右双旋 5、AVL树的验证 6、AVL树的性能 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;会大仙&#xff0c;这几个容器有个共同点是…

【AI大模型】程序员AI的未来——Copilot还是Claude3.5 Sonnet?

近期&#xff0c;Anthropic发布了Claude 3.5 的“大杯”模型 —— Claude 3.5 Sonnet&#xff01; 这次发布的 Sonnet 代表意大利的“十四行诗”&#xff0c;结构复杂&#xff0c;在智能水平、功能多样性和处理能力上都有所提升&#xff0c;能够应对更复杂的认知任务&#xff…