优先级队列(堆)的概念+模拟堆的实现

文章目录

  • 优先级队列(堆)的概念+模拟堆的实现
    • 一、概念
    • 1.优先级队列
    • 2.堆
      • 1.堆的性质
      • 2.堆的存储
      • 3.堆的创建
        • 3.1 向下调整
        • 3.2建堆的时间复杂度 O(N)
      • 4.堆的插入
        • 4.1向上调整
        • 4.2向上调整建堆的时间复杂度:O(N * log N)
      • 5.堆的删除


优先级队列(堆)的概念+模拟堆的实现


一、概念

1.优先级队列

优先级队列 Priority Queue

  • 队列中操作的数据带有优先级,出队的时候,优先级高的先出
  • 可以返回最高优先级对象,可以添加新的对象
  • 在Java1.8中,priorityQueue的底层使用了堆,堆的相当于对完全二叉树进行了调整

2.堆

  • 将一个关键码的集合中所以元素,按照完全二叉树的顺序,存进一个一维数组当中

1.堆的性质

1.堆中结点的值,总是不大于/不小于它父亲结点的值

2.堆总是一棵完全二叉树

在这里插入图片描述

2.堆的存储

  • 堆是一棵完全二叉树,层序的规则可以用顺序的方法来存储

  • 完全二叉树从上到下,从左往右依次排列,存进数组中没有空的位置

  • 结点在数组下标为i,其双亲结点为( i - 1 )/ 2

  • 左孩子:2 * i +1 ; 右孩子:2 * i + 2

3.堆的创建

3.1 向下调整

每棵树都向下调整,维护大根堆

  • 向下调整的时间复杂度:== 树的高度

  • 向下调整建堆的时间复杂度:O(n)

在这里插入图片描述

  • 每棵树从父结点向下走,要找到每棵树的父结点

  • 从最后一棵子树来进行调整,找到最后一个结点和它的双亲结点,遍历得到父结点的下标

  • 找到最大的子节点,比较后进行交换

public class TestHeap {public int[] elem;//底层是一个一维数组public int usedSize;//记录当前堆中有多少条数据public TestHeap() {this.elem = new int[10];}public void initElem(int[] array) {//初始化for (int i = 0; i < array.length; i++) {elem[i] = array[i];usedSize++;}}
}

1.进行初始化

    public void createHeap() {//堆的创建//最后一个结点的下标= usedSize-1,它的双亲结点的下标= (usedSize-1-1)/2for (int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--) {//求出parentshiftDown(parent, usedSize);//结束下标传usedSize//结束的结点下标的值不会超过usedSize}}/*** 父亲下标* 每棵树的结束下标** @param parent* @param len*/private void shiftDown(int parent, int len) {//向下调整,每棵树从父结点向下走int child = 2 * parent + 1;// child < len最起码要有一个左孩子while (child < len) {//child + 1保证一定有右孩子的情况下,和右孩子比较if (child + 1 < len && elem[child] < elem[child + 1]) {//右孩子大child++;}//保证child的下标是左右孩子最大值的下标if (elem[child] > elem[parent]) {//如果子节点的值比父结点的大,交换int tmp = elem[child];elem[child] = elem[parent];elem[parent] = tmp;parent = child;//交换完成后,让parent结点等于等于当前child结点,child = 2 * parent + 1;//重新求子节点的位置,再次进入循环交换} else {break;//比父结点小,结束循环}}}

堆的创建

1.遍历得到每个双亲结点,根据双亲结点找到子节点,保证child的下标是左右孩子最大值的下标

2.子节点和父结点比较并交换

3.2建堆的时间复杂度 O(N)

向下调整的方式建立大根堆、小根堆,时间复杂度约等于O(n)

在这里插入图片描述

用满二叉树来分析

4.堆的插入

    public void offer(int val) {if (isFull()) {//如果满了就扩容elem = Arrays.copyOf(elem, 2 * elem.length);}elem[usedSize++] = val;//存到最后//进行向上调整shiftUp(usedSize - 1);//传进孩子结点的下标}public boolean isFull() {return usedSize == elem.length;}private void shiftUp(int child) {//向上调整,已知孩子结点的下标求父亲结点的下标int parent = (child - 1) / 2;while (child > 0) {//循环结束的条件就是child =0if (elem[child] > elem[parent]) {//比较、交换int tmp = elem[child];elem[child] = elem[parent];elem[parent] = tmp;child = parent;parent = (child - 1) / 2;} else {break;}}}
4.1向上调整
  • 插入到有效数据的最后,空间不够要扩容,成为新的子节点,已知孩子结点,求父亲结点
  • 向上调整,调整的过程中,直接和父结点比较,如果比父结点的值大就交换
  • 不用比较左右孩子的最大值,因为根节点的子树本身就是大根堆,不用进行维护
4.2向上调整建堆的时间复杂度:O(N * log N)

在这里插入图片描述

5.堆的删除

  • 1.堆的删除,删除的是堆顶元素
  • 2.将0下标和最后一个元素的下标进行交换,将堆中有效数据个数减少一个
  • 3.对堆顶元素进行向下调整,只需要调整0下标的数
    /*** 删除堆顶*/public void pop() {if (isEmpty()) {return;}swap(elem, 0, usedSize - 1);//堆顶和最后一个元素交换usedSize--;//删除一个元素shiftDown(0, usedSize);//向下调整}public boolean isEmpty() {return usedSize == 0;}private void swap(int[] array, int i, int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}public int peek() {if (isEmpty()) {return -1;}return elem[0];}

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

前端使用firebase配置第三方登录介绍(谷歌登录,facebook登录等)

参考文档 点此处去 firebase 官网点此处去 web端的谷歌登录文档点此处去 facebook开发者官网链接 实现&#xff08;谷歌登录&#xff09; 首先注册一个账号登录firebase&#xff08;可以使用谷歌账号登录&#xff09;然后创建项目&#xff08;走默认配置就行了&#xff09; …

什么是超级托斯卡纳葡萄酒?

超级托斯卡纳葡萄酒通常被认为是在托斯卡纳用国际葡萄品种制成的葡萄酒&#xff0c;如赤霞珠、品丽珠或梅洛&#xff0c;而不是传统的托斯卡纳葡萄桑娇维塞。来自云仓酒庄品牌雷盛红酒分享这些葡萄酒可能包含一些桑娇维塞&#xff0c;但这通常不是混合中的主要葡萄。这些大胆的…

FMCW雷达论文速览 | TRS 2023, 基于FMCW雷达的多天线高精度测距算法及性能分析

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 TRS 2023 | High Accuracy Multi-antenna Ranging Algorithm and Performance Analysis for FMCW Radar 论文原文:https://ieeexplore.ieee.org/document/10309162 Z. Xu, S. Qi and P. Zh…

制药企业如何提高员工的GMP合规意识

在上期的文章中&#xff0c;我们介绍了>>制药企业计算机化系统验证(CSV)的重要性&#xff0c;本期我们深入探讨制药企业如何培养员工形成GMP良好的合规意识。 良好的药品质量是保障患者安全和有效治疗的基石。为了确保药品的质量、安全性和一致性&#xff0c;制药企业必…

GaN HEMT 电容的分析建模,包括寄生元件

标题&#xff1a;Analytical Modeling of Capacitances for GaN HEMTs, Including Parasitic Components 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;14年&#xff09; 摘要&#xff1a;本文提出了一种基于表面势的终端电荷和电容模型&#xff0c;包…

Hbuiderx链接到夜神模拟器(DCloud数字天堂)

赞助 DCloud 即数字天堂&#xff08;北京&#xff09;网络技术有限公司是 W3C成员及 HTML5中国产业联盟 发起单位 Hbuiderx切换使用夜神模拟器自带的ADB.exe链接到夜神模拟器 同步资源失败&#xff0c;未得到同步资源的授权&#xff0c;请停止运行后重新运行&#xff0c;并注意…

【React】04.MVC模式和MVVM模式

React是Web前端框架 1、目前市面上比较主流的前端框架 ReactAngular&#xff08;NG框架&#xff09;Vue 主流的思想&#xff1a; 不在直接去操作DOM&#xff0c;而是改为“数据驱动思想” 操作DOM思想&#xff1a; 操作DOM比较消耗性能[主要原因就是&#xff0c;可能会导…

Vue2+elementui项目导出el-table的数据为xlsx表格

1、安装3个插件 &#xff08;file-saver、 xlsx、script-loader&#xff09; npm install -S file-saver xlsxnpm install -D script-loader 2、在utils目录下新建一个 Export2Excel.js 脚本 &#xff08;我的路径在/utils/Export2Excel.js&#xff09; /* eslint-disable *…

在Docker中设置Redis的密码

目录 1&#xff0c;介绍2&#xff0c;实现“Docker Redis设置密码”的整体流程3&#xff0c;具体实现步骤4&#xff0c;结论 1&#xff0c;介绍 Docker是一个开源的应用容器引擎&#xff0c;可以自动化部署、扩展应用程序。它可以帮助开发人员将应用程序及其依赖项打包到一个可…

three.js点滴yan(整理后)

场景、相机和渲染器 Three.js整个系统主要包含场景Scene、相机Camera和WebGL渲染器WebGLRenderer三大块&#xff0c;其中场景又包含模型和光源。WebGL渲染器的主要作用就是把相机对应场景渲染出来&#xff0c;显示在网页Cnavas画布上。 Three.js源码 Three.js各个构造函数对应…

Redis 扩展 RedisBloom 插件,解决缓存击穿、穿透

文章目录 一、概述二、编译准备2.1 升级 make2.2 安装 Python3 三、编译 RedisBloom四、测试 RedisBloom五、应用场景5.1 缓存击穿5.2 缓存穿透5.3 原理总结 六、存在的问题 如果您对Redis的了解不够深入请关注本栏目&#xff0c;本栏目包括Redis安装&#xff0c;Redis配置文件…

于道 - 前端项目启动步骤参考

1. 安装 启动过程有9个步骤&#xff1a; 1.1 安装 Node JS , V18版本的 &#xff08;安装步骤省略&#xff09; 1.2 安装 npm install -g yarn &#xff0c;node JS里边好像自带npm &#xff0c;通过npm的命令安装 yarn 1.3 切换到项目中去安装&#xff0c;npm install &a…

Wsl2 Ubuntu在不安装Docker Desktop情况下使用Docker

目录 1. 前提条件 2.安装Distrod 3. 常见问题 3.1.docker compose 问题无法使用问题 3.1. docker-compose up报错 参考文档 1. 前提条件 win10 WSL2 Ubuntu(截止202308最新版本是20.04.xx) 有不少的博客都是建议直接安装docker desktop&#xff0c;这样无论在windows…

计算机基础知识45

JS的RegExp对象(正则) text: 正则校验数据 # T/F match: 匹配 # (3) [s, s, s] //定义 var reg1 new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); var reg2 /^[a-zA-Z][a-zA-Z0-9]{5,9}$/; //正则校验数据 var res reg1.test(jason666); console.log(res…

前端之Bootstrap框架

目录 【一】Bootstrap介绍 【二】Bootstrap引入 【1】CDN加速链接 【2】注意 【三】布局容器 【四】栅格系统 【五】栅格参数 【六】列偏移 【七】排版 标题 内联文本元素 对齐 改变大小写 引用 列表 【八】表格 基本实例 条纹状表格 带边框的表格 鼠标悬停…

接口测试总结

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

武汉某母婴用品公司 - 集简云连接ERP和营销系统,实现库存管理的自动化

品牌介绍与关怀理念 武汉某母婴用品公司是一家专注于高端孕婴童护理用品的企业&#xff0c;积极响应和关怀孕产人群&#xff0c;全方位提供从待产用品到产后护理用品&#xff0c;再到婴童洗护用品和初生婴儿用品等一系列全面的母婴产品。我们的使命是满足客户的需求&#xff0…

SpringBoot集成-阿里云对象存储OSS

文章目录 阿里云 OSS 介绍准备工作SpringBoot 集成 OSS 阿里云 OSS 介绍 阿里云对象存储 OSS &#xff08;Object Storage Service&#xff09;&#xff0c;是一款海量、安全、低成本、高可靠的云存储服务。使用 OSS&#xff0c;你可以通过网络随时存储和调用包括文本、图片、…

前端常用的开发工具有哪些?

目录 内置管理系统的通用场景 前后端代码生成器 权限管控 开放源码 运行性能 主流数据库 写在最后 目前使用的是JNPF框架。 前端采用Vue.js&#xff0c;这是一种流行的前端JavaScript框架&#xff0c;用于构建用户界面。Vue.js具有轻量级、可扩展性强和生态系统丰富等特点&…

NCV7721D2R2G一款完全保护的双半桥驱动器 专为汽车工业运动控制解决方案

NCV7721D2R2G是一款完全保护的双半桥驱动器&#xff0c;专为汽车和工业运动控制应用而设计。两个半桥驱动器具有独立控制。这允许高侧、低侧和H桥控制。H桥控制提供正向、反向、制动和高阻抗状态。驱动器通过逻辑电平输入进行控制。 特性&#xff1a; 1.睡眠模式下的超低静态电…