算法通关村十四关:青铜-堆结构

青铜挑战-堆结构

堆结构:重要的基础数据结构

明确什么类型的题目可以用堆,以及如何用堆来解决

堆的构造和维护过程都非常复杂

1.堆的概念与特征

1.1基本概念

堆:是将一组数据按照 完全二叉树 的存储顺序,将数据存储在一个一维数组中的结构。

完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

堆有两种结构:大顶堆、小顶堆(其他叫法:大根堆、小跟堆,最大堆、最小堆)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

父子之间关系的建立,节点下标为i

  • i=0时,为跟节点
  • i>=1时,父节点为(i-1)/2

1.2堆与优先队列

优先队列和堆不是一个同level的概念
Java的PriorityQueue就是堆实现的,Java领域可以认为堆就是优先级队列,优先级队列就是堆,换做其他场景则不行

2.堆的构造过程

使用数组构造堆时,先按照层次将所有元素依次填入二叉树中,使其成为二叉树,然后再不断调整,最终使其符合堆结构

  1. 将元素依次排到完全二叉树节点上去
  2. 找到下标为 (size-2)/2 = 4的节点i,调整其位置,满足堆性质
  3. 找到i-1节点,调整位置,满足堆性质
  4. 重复上述,直到调整完跟节点

3.插入操作

插入规则

  1. 将元素插入到保持其为完全二叉树的最后一个位置
  2. 然后顺着这条支路一直向上调整,每前进一层就要保证其子树都满足堆否则就去处理子树,直到完全满足要求

4.删除操作

堆本身比较特殊,一般对堆中进行删除操作都是针对堆顶的元素

直接删除堆顶,整个结构被破坏了,实际策略是先将堆中的最后一个元素(加入为A)和堆顶元素进行替换,然后删除堆中最后一个元素。
之后再从根开始逐步与左右比较,谁更大谁上位。
然后A再继续与子树比较,如果有更大的继续交换,直到自己所在的子树也满足大顶堆

形象比喻:
皇上突然驾崩了,这时候先找个顾命大臣维持局面,大臣先看左右两个皇子谁更强谁就是老大。然后大臣自己再逐步隐退,直到找到属于自己的位置。

5.总结

堆的价值体现
大顶推的根节点是整个树最大的那个,增加时会根据根的大小来决定要不要加,删除操作只删除根元素。

为什么堆的效率比较高?
堆元素的数量是有限制的,一般不用将所有元素都放到堆里

后面题目中可以看到,在序列中找k大,则堆的大小就是k;如果k个链表合并,那么堆就是k。

堆的口诀
查找:找大用小,大的进;找小用大,小的进。
排序:升序用小,降序用大。

口诀解释:
找K大,则用小堆,后序数据只有比根元素更大时才允许进入堆。
找K小,则用大堆,后序数据只有比根元素更小时才允许进入堆。

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

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

相关文章

深入浅出玩转FPGA——笔记8 漫谈状态机设计

1 状态机的基本概念 硬件的并行性决定了用不同verilog描述的硬件实现(比如不同的always语句)都是并行执行的,那么如果希望分多个时间完成一个任务,怎么办? 方法1 可以用多个使能信号赖衔接多个不同的模块,…

S32K324芯片学习笔记

文章目录 Core and architectureDMASystem and power managementMemory and memory interfacesClocksSecurity and integrity安全与完整性Safety ISO26262Analog、Timers功能框图内存mapflash Signal MultiplexingPort和MSCR寄存器的mapping Core and architecture 两个Arm Co…

centOS下载与安装

1 下载centOS镜像 The CentOS Project 选择阿里云的镜像 2 下载虚拟机 Vmware workstation VMware - Delivering a Digital Foundation For Businesses 1 下载安装 centOs是一个操作系统,操作硬件的。所以需要有机器,可以使用虚拟机。 2 创建新的虚…

React的jsx的用法

React是一个流行的JavaScript库,用于构建用户界面。它使用一种名为JSX的语法扩展来描述组件的结构和样式。JSX是React的核心语言之一,它允许开发人员在JavaScript中编写HTML,从而使代码更加简洁和易于阅读。 JSX是一种语法扩展,它…

深入理解联邦学习——联邦学习的分类:基础知识

分类目录:《深入理解联邦学习》总目录 在实际中,孤岛数据具有不同分布特点,根据这些特点,我们可以提出相对应的联邦学习方案。下面,我们将以孤岛数据的分布特点为依据对联邦学习进行分类。 考虑有多个数据拥有方&…

Go学习[合集]

文章目录 Go学习-Day1Go学习-Day2标识符变量基础语法字符串类型类型转换string和其他基本类型转换其他类型转stringstring转其他类型 指针类型运算符标准IO分支语句 Go学习-Day3循环语句函数声明init函数匿名函数闭包defer Go学习-Day4函数值传递,引用传递常用的函数…

Kotlin的遍历方法

for循环 在下面代码中1…10表示的是1到10,两边都是闭包,输出12345678910 for (i in 1..10) println(i)加上花括号也支持 for (i: Int in 1..10) {println(i)}另外,当对整数进行for循环时,Kotlin还提供了一个step函数来定义迭代的…

利用python制作AI图片优化工具

将模糊图片4K高清化效果如下: 优化前的图片 优化后如下图: 优化后图片变大变清晰了效果很明显 软件界面如下: 所用工具和代码: 1、所需软件包 网盘链接:https://pan.baidu.com/s/1CMvn4Y7edDTR4COfu4FviA提取码&…

【SpringMVC】工作流程及入门案例

目录 前言 回顾MVC三层架构 1. SpringMVC简介 …

Nginx安装及配置负载均衡

文章目录 官网下载Nginx解压安装常用命令配置负载均衡七层负载均衡nginx的负载均衡语法nginx的负载均衡策略故障下线和备份服务设置proxy_pass参数 官网下载Nginx http://nginx.org/en/download.html 注:下载稳定版,即Stateable Version的,…

《智能网联汽车自动驾驶功能测试规程》

一、 编制背景 2018 年4 月12 日,工业和信息化部、公安部、交通运输部联合发布《智能网联汽车道路测试管理规范(试行)》(以下简称《管理规范》),对智能网联汽车道路测试申请、审核、管理以及测试主体、测试驾驶人和测试车辆要求等…

【Kafka】ZooKeeper启动失败报错java.net.BindException: Address already in use: bind

问题描述 Kafka 2.8.1 ZooKeeper启动失败。 zookeeper-server-start.bat ../../config/zookeeper.properties[2023-09-04 18:21:49,497] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory) [2023-09-04 18:21:49,498] ERROR Un…

船舶稳定性和静水力计算——绘图体平面图,静水力,GZ计算(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Qt鼠标点击事件处理:显示鼠标点击位置(完整示例)

Qt 入门实战教程(目录) 前驱文章: Qt Creator 创建 Qt 默认窗口程序(推荐) 什么是事件 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。 事件(event)驱动…

RHCA之路---EX280(4)

RHCA之路—EX280(4) 1. 题目 Use the S2I functionality of your OpenShift instance to build an application in the rome project Use the Git repository at http://services.lab.example.com/php-helloworld for the application source Use the Docker image labeled re…

java八股文面试[数据库]——mysql主从复制

什么是mysql的主从复制? MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点…

[系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取数据集详解

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

力扣71. 简化路径

71. 简化路径 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 / 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身&a…

【Spring Boot】使用MyBatis注解实现数据库操作

使用MyBatis注解实现数据库操作 MyBatis还提供了注解的方式,相比XML的方式,注解的方式更加简单方便,无须创建XML配置文件。接下来好好研究注解的使用方式。 1.XML和注解的异同 1)注解模式使用简单,开发效率高&#…

C++类和对象

文章目录 C类和对象封装类的封装性类的初识构造和析构构造和析构函数定义构造的分类以及调用深拷贝与浅拷贝初始化列表与成员对象对象成员的初始化列表 explicit 关键字动态对象的创建对象的创建new operator给基本对象申请空间给对象申请空间 静态成员静态成员变量静态成员函数…