二叉树--堆

news2024/11/30 12:34:27

 1.二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

2.堆的概念和结构

这里的堆是一种数据结构,可以分为物理结构和逻辑结构,优先级队列。

物理:数组

逻辑:完全二叉树

堆的性质:

堆可以分为大堆和小堆。

注意:大堆和小堆都不代表有序。

后面需要相应的代码调整来实现它的有序(这就是后面要讲的堆排序)。

大堆:父亲大于等于孩子

小堆:父亲小于等于孩子

3.堆的实现

3.1建堆

对于给定的一个数组,在这个数组逻辑上可以看做是一个完全二叉树,我们可以通过算法把它调整成为大堆或者小堆,建堆可以分为向上调整建堆和向下调整建堆。

以下是向上建堆建成小堆的代码示例,大堆只要改成 > 就行了。

向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

以下是向下调整建堆建成小堆的代码示例,大堆只要改成 > 就行了。

3.2建堆的时间复杂度

因为堆是完全二叉树,而满二叉树也是完全二叉树。

为了简化使用满二叉树来证明(时间复杂度本来看的 就是近似值,多几个结点不影响最终结果):

以下示例用公式推导来详细介绍向下调整建堆的时间复杂度。

向下调整建堆是从最后一个非叶子结点的子树开始调整,一直调到根节点的树,就可以调整成堆。

向上调整建堆的时间复杂度是O(N*logN)

向上调整建堆的公式推导与上面类似,有兴趣的可以自己推导一番.

3.3堆的插入

3.4堆的删除

3.5堆的应用

3.5.1堆排序

堆排序就是用堆的思想来进行排序,一共分为两个步骤:

        1.建堆

                降序:建小堆

                升序:建大堆

        2.利用堆的删除思想来进行排序

                建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。

3.5.2TOP - K问题

TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。

比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

对于Top-K问题,能想到的最简单直接的方式就是排序,直接建成大堆或者小堆取前K个元素。

但是:如果数据量非常大,排序就不太可取了(可能 数据都不能一下子全部加载到内存中)。

最佳的方式就是用堆来解决,基本思路如下:

1. 用数据集合中前K个元素来建堆(时间复杂度O(K))

        前k个元素,建小堆

        前k个元素,建大堆

2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素
(时间复杂度O(logK*(N - K)))

将剩余N-K个元素依次与堆顶元素比完之后

堆中剩余的K个元素就是所求的前K个最小或者最大的元素。

3.总的时间复杂度O(N)

3.6堆的实现

数据结构: 手撕数据结构 - Gitee.com

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

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

相关文章

CSP-J Day 4 模拟赛补题报告

姓名:王胤皓,校区:和谐校区,考试时间: 2024 2024 2024 年 10 10 10 月 4 4 4 日 9 : 00 : 00 9:00:00 9:00:00~ 12 : 30 : 00 12:30:00 12:30:00,学号: S 07738 S07738 S07738 请关注作者的…

Windows应用开发-解析AVI视频文件

本Windows应用解析AVI视频文件,以表格的方式显示AVI文件结构。并可以将结果保存到bmp图片。下面是,使用该应用解析一部AVI电影获得的图片。 应用开发信息 定义一个INFO结构,包含两个字符串对象,一个ULONGLONG变量,和…

奔驰AMG GT50升级原厂阀门运动排气声浪效果

AMG 排气系统 声浪级别可控制的AMG高性能排气系统可带来不同凡响的听觉体验。借助可调式废气风门,按下按钮,即可按需改变车辆的声浪,体验不同音色。静谧深沉或动感澎湃,悦耳声浪,如你所愿。

Python画笔案例-076 绘制纯画笔弹球

1、绘制纯画笔弹球 通过 python 的turtle 库绘制 纯画笔弹球,如下图: 2、实现代码 绘制纯画笔弹球,以下为实现代码: """纯画笔弹球动画.py读者可以在此基础上把它修改成一个拦球游戏。步骤为,建立一个Rect类,即矩形类。然后采用按键检测,当按了键时重画…

​​Python+Matplotlib可视化简单反函数和复合函数

import numpy as np import matplotlib.pyplot as plt# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] # 用黑体显示中文 plt.rcParams[axes.unicode_minus] False # 正常显示负号# 创建图形和子图 fig, (ax1, ax2) plt.subplots(1, 2, figsize(15, 6))# 反函数示…

Line: 折线图

对北京市、天津市、上海市、重庆市的近10年人口,做出折线图,效果 参考:Line - Basic_line_chart - Document (pyecharts.org) 1、折线图模板 import pyecharts.options as opts from pyecharts.charts import Linex_data ["Mon"…

基于Springboot+Vue的中医院问诊系统的设计与实现 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

内存卡数据恢复软件大揭秘,拯救你的重要数据

我们的生活中充斥着各种各样的数据,而内存卡作为一种常见的数据存储设备,承载着我们的照片、视频、文档等重要信息。然而存储在电子设备上就有可能导致数据丢失的情况。今天我们一起来探讨内存卡数据恢复的一些工具吧。 1.福晰内存卡数据恢复 连接直达…

ros2使用roscore报错

如果你在ros2中使用roscore命令,可能会出现报错。 即使你按照下面的命令安装python3-roslaunch,还是会报错。 注意,在ROS2中,已经不需要通过roscore命令启动ROS系统了。 ROS2中,不再需要ROS1中的roscore命令来启动一个…

【Python】Arrow使用指南:轻松管理日期与时间

Arrow 是一个基于 Python 的日期与时间管理库,提供了更人性化和直观的 API 处理时间数据。与 Python 标准库中的 datetime 模块相比,Arrow 极大地简化了时间创建、转换、格式化和操作的步骤。它通过统一的接口封装了常见的时间操作,支持时区转…

[C语言]--编译和链接

文章目录 目录 文章目录 前言 一、环境介绍 二、翻译环境 1.预处理(预编译) 2.编译 3.汇编 4.链接 三、运行环境 前言 对编译和链接 进行简单的介绍 一、环境介绍 在ANSIC的任何⼀种实现中,存在两个不同的环境。 翻译环境,在这…

Python从入门到高手4.4节-算法实战之计算次大值

目录 4.4.1 四个随机数中的次大值 4.4.2 计算次大值的算法思路 4.4.3 使用循环计算次大值 4.4.4 祝祖国繁荣昌盛 4.4.1 四个随机数中的次大值 假设有四个整型变量,它们值的大小未知,该怎么计算出四个中的次大值? 次大值即第二大的数。初…

vsomeip用到的socket

概述: ​ vsomeip用到的socket的代码全部都在implementation\endpoints目录下面,主要分布在下面六个endpoint类中: local_client_endpoint_impl // 本地客户端socket(UDS Socket或者127.0.0.1的socket)local_server…

深入挖掘C++中的特性之一 — 继承

目录 1.继承的概念 2.举个继承的例子 3.继承基类成员访问方式的变化 1.父类成员的访问限定符对在子类中访问父类成员的影响 2.父类成员的访问限定符子类的继承方式对在两个类外访问子类中父类成员的影响 4.继承类模版(注意事项) 5.父类与子类间的转…

FTP服务原理及使用

一、配置FTP服务 配置FTP服务,内容不难,本地虚拟机上自带FTP服务程序,自己下载即可。 二、理解FTP的主动模式和被动模式原理 1 主动模式 客户端先开启一个大于1024的随机端口,用来与服务器的21号端口建立控制连接;当…

rabbitmq消费者应答模式

1.应答模式 RabbitMQ 中的消息应答模式主要包括两种:自动应答(Automatic Acknowledgement)和手动应答(Manual Acknowledgement)。 自动应答: 不在乎消费者对消息处理是否成功,都会告诉队列删…

win11远程连接MySQL(linux版),不需安装docker容器

不想安装虚拟机,想在Windows 11上运行Linux。 在win11的搜索框内,搜索"启用或关闭",出现了“启用或关闭Windows功能”,双击打开。 勾选"适用于Linux的Windows子系统",“虚拟机平台”&#xff0c…

网站可疑问题

目标站点 Google hack 页面访问 抓包 POST /admin.php?actionlogin HTTP/2 Host: www.xjy.edu.cn Cookie: xkm_sidA6x4Cgw2zx User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0 Accept: text/html,application/xhtmlxml,appl…

AtCoder ABC373 A-D题解

ABC372 的题解没写是因为 D 是单调栈我不会(⊙︿⊙) 比赛链接:ABC373 总结&#xff1a;wssb。听说 E 很水&#xff1f;有时间我看看。 Problem A: Code #include <bits/stdc.h> using namespace std; int mian(){int ans0;for(int i1;i<12;i){string S;cin>&g…

7c结构体

文章目录 一、结构体的设计二、结构体变量的初始化2.1结构体在内存表示&#xff1b;**2.2**结构体类型声明和 结构体变量的定义和初始化只声明结构体类型声明类型的同时定义变量p1用已有结构体类型定义结构体变量p2*定义变量的同时赋初值。*匿名声明结构体类型 2.3 结构体嵌套及…