当前位置: 首页 > news >正文

学习数据结构(11)二叉树(堆)下

1.堆的概念

如果有⼀个集合 K = {k0,k1,k2,...,k(n-1)} ,把它的所有元素按完全二叉树的形式存储在一个一维数组中,并满足:K(i)<=2*i+1且K(i)<=2*i+2(K(i)>=2*i+1且K(i)>=2*i+2),i=0,1,2... ,则称为小堆(或大堆),将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆

例:有一组数据:10,65,70,30,15,25

                                

2.堆的实现

(1)初始化堆

(2)堆的销毁

(3)交换

(4)堆的插入

 (5)向上调整

为了构建小堆或大堆,在插入数据时,可以将插入的数据看作孩子,在满足双亲的下标>=0(孩子的下标大于0)将孩子与双亲作对比,向上调整数据

图例:

向上调整算法的时间复杂度:(为了简化使用满二叉树来证明)

则每层节点需要移动的次数为:每层结点的个数*向上移动的次数,节点总共需要移动的次数为:所有层节点需要移动的次数之和

T(h)=2^1*1+2^2*2+2^3*3+...+2^(h-2)*(h-2)+2^(h-1)*(h-1)                       ①

2*T(h)=2^2*1+2^3*2+2^4*3+...+2^(h-1)*(h-2)+2^(h)*(h-1)                       ②

①-②:-T(h)=2^1+2^2+2^3+...+2^(h-2)+2^(h-1)-2^h*(h-1)                                                                                    =2^h-2-2^h*(h-1)                                                                                                                                =2^h(2-h)-2

T(h)=2^h(h-2)+2,根据二叉树的性质:n=2^h-1,h=log2(n+1)

得F(n)=(n+1)(log2(n+1)-2)+2,故向上调整算法的时间复杂度为:O(n*log2(n))

(6)打印堆

(7)判空

 (8)堆的删除

删除堆顶数据就是将数组开头的元素和数组末尾的元素交换,将堆中size的值减一,此时堆中的结构可能被改变,不再是大堆(小堆),需要将堆顶元素向下调整

(9)向下调整

以此时的堆顶元素为双亲,在满足孩子的下标小于堆元素个数的情况下,与两个孩子作对比(如果没有右孩子,则只和左孩子做对比),不断向下调整数据

图例:

向下调整算法的时间复杂度:(为了简化使用满二叉树来证明)

则每层节点需要移动的次数为:每层结点的个数*向下移动的次数,节点总共需要移动的次数为:所有层节点需要移动的次数之和

T(h)=2^0*(h-1)+2^1*(h-2)+2^2*(h-3)+...+2^(h-3)*2+2^(h-2)*1                       ①

2*T(h)=2^1*(h-1)+2^2*(h-2)+2^3*(h-3)+...+2^(h-2)*2+2^(h-1)*1                    ②

②-①:T(h)=2^1+2^2+2^3+...+2^(h-2)+2^(h-1)+1-h                                                                                             =2^h-1-h

根据二叉树的性质:n=2^h-1,h=log2(n+1) 

T(n)=n-log2(n+1),故向下调整算法的时间复杂度为O(n)                        

(10)取堆顶元素

3.堆排序

(1)在数据结构堆中实现排序

创建数据结构堆,将数组中的元素一一插入堆中,在堆不为空的情况下,循环取堆顶放入数组中,再删除堆顶,每次取出的堆顶都是堆中的最大值或最小值,由此实现升序或降序排列

(2)利用堆的思想在数组中实现排序

通过向上调整或向下调整将数组排列成堆的结构(若要排升序,则建大堆,排降序,则建小堆),将数组开头的元素和末尾的元素交换,将此时数组开头的元素看作双亲,向下调整

堆排序算法的时间复杂度为:O(nlog2(n)),效率高于冒泡排序

相关文章:

学习数据结构(11)二叉树(堆)下

1.堆的概念 如果有⼀个集合 K {k0&#xff0c;k1&#xff0c;k2&#xff0c;...&#xff0c;k(n-1)} &#xff0c;把它的所有元素按完全二叉树的形式存储在一个一维数组中&#xff0c;并满足&#xff1a;K(i)<2*i1且K(i)<2*i2&#xff08;K(i)>2*i1且K(i)>2*i2&a…...

HarmonyOS NEXT网络状态监听HTTP和RCP请求网络

当我们在HarmonyOS NEXT中开发的应用&#xff0c;基本上都会使用网络请求&#xff0c;从服务端获取数据在客户端显示或者供用户交互&#xff0c;有时候网络发生变化时&#xff0c;我们需要做一些相应的操作&#xff0c;接下来我们一起来了解下在HarmonyOS NEXT下如何监听网络状…...

MySQL数据库(4)—— 数据类型

目录 一&#xff0c;数据类型分类 二&#xff0c;数值类型 2.1 tinyint类型 2.2 bit类型 2.3 float类型 2.4 decimal类型 三&#xff0c;字符串类型 3.1 char类型 3.2 varchar类型 四&#xff0c;时间日期类型 五&#xff0c;enum和set类型 5.1 基本使用 5.2 解释查…...

如何在Odoo 18中创建记录规则Rule

如何在Odoo 18中创建记录规则Rule 记录规则是管理访问控制的关键&#xff0c;它能让你依据用户角色&#xff0c;定义谁可以在系统内查看、创建或修改特定记录。例如&#xff0c;公司中的普通员工只能查看或修改与与自己直接相关的数据&#xff0c;而经理则有权限访问和编辑所有…...

petalinux高版本设置自动登录和开机自启动配置

petalinux-config -c rootfs 依次选择 Image Features -> serial-autologin-root 这是配置 进来就是root权限 创建并安装名为 myapp-init 的新建应用程序 petalinux-create -t apps --template install -n myapp-init --enable 编辑 project-spec/meta-user/recipes-…...

操作系统2.4

一、死锁&#xff0c;饥饿&#xff0c;死循环 死锁&#xff1a;各进程互相等待对方手里的资源&#xff0c;导致各进程都阻塞&#xff0c;无法向前推进的现象 饥饿&#xff1a;由于长期得不到想要的资源&#xff0c;某进程无法向前推进的现象&#xff0c;例如&#xff1a;短进…...

Springboot + Ollama + IDEA + DeepSeek 搭建本地deepseek简单调用示例

1. 版本说明 springboot 版本 3.3.8 Java 版本 17 spring-ai 版本 1.0.0-M5 deepseek 模型 deepseek-r1:7b 需要注意一下Ollama的使用版本&#xff1a; 2. springboot项目搭建 可以集成在自己的项目里&#xff0c;也可以到 spring.io 生成一个项目 生成的话&#xff0c;如下…...

解析DrugBank数据库数据|Python

一、DrugBank 数据库简介 DrugBank 是一个综合性的生物信息学和化学信息学数据库&#xff0c;专门收录药物和靶点的详细信息。它由加拿大阿尔伯塔大学的 Wishart 研究组 维护&#xff0c;提供化学、药理学、相互作用、代谢、靶点等多方面的药物数据。DrugBank 结合了实验数据和…...

CUDA Toolkit 历史版本 cuda安装

cuda安装 CUDA Toolkit 版本选择1. NVIDIA-SMI 525.60.11静默安装2. CUDA Toolkit 12.6.0 安装禁用 nouveau依赖安装下载安装 cuda显卡驱动安装成功设置环境变量 3. 安装失败切换到多用户文本模式 参考 CUDA Toolkit 版本选择 CUDA Toolkit 历史版本 1. NVIDIA-SMI 525.60.11 …...

Aseprite详细使用教程(12)——轮廓工具和多边形工具

一、轮廓工具 &#xff08;1&#xff09;核心功能 轮廓生成&#xff1a;给鼠标起点和终点的连线以及两点经过的路径形成的轮廓&#xff0c;可单独指定轮廓颜色。 &#xff08;2&#xff09; 使用方法 选择工具后&#xff0c;鼠标左键点击&#xff0c;按住不松手&#xff0c;拖动…...

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end...

分布式架构与XXL-JOB

目录 先了解什么是任务调度&#xff1f; 什么是分布式任务调度&#xff1f; 了解XXL-JOB分布式任务调度平台 如何搭建XXL-JOB&#xff1f; 分片广播 作业分片方案 最近学习在项目的媒资管理模块如何高效处理大量视频&#xff0c;上传单个视频可能涉及到转码&#xff0c…...

leetcode day18 移除元素 26+283

26 删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元…...

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…...

用Deepseek查询快证API-物流查询-实名认证-企业实名认证

快证API可能是一个提供多种验证和查询服务的平台&#xff0c;包括但不限于企业实名认证、短链接生成、手机号归属地查询、IP地址查询等。以下是根据搜索结果整理的关于快证API的相关信息&#xff1a; ‌企业实名认证API‌&#xff1a; 功能&#xff1a;通过与企业相关数据库进行…...

一个简洁高效的Flask用户管理示例

Flask-Login 是 Flask 的用户管理扩展&#xff0c;提供 用户身份验证、会话管理、权限控制 等功能。 适用于&#xff1a; • 用户登录、登出 • 记住用户&#xff08;“记住我” 功能&#xff09; • 限制未登录用户访问某些页面 • 用户会话管理 1. 安装 Flask-Login pi…...

分布式之分布式ID

目录 需求 1. 全局唯一性 2. 高性能 3. 高可用性 4. 可扩展性 5. 有序性 6. 时间相关 7. 长度适中 8. 安全性 9. 分布式一致性 10. 易于集成 常见解决方案 选择依据 数据库号段模式 核心概念 工作流程 优点 缺点 实现示例 优化策略 适用场景 Snowflake雪…...

(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念

目录 前言与导论 碎碎念 所以&#xff0c;我到底需要知道哪些东西呢 从一些基础的概念入手 常见的工具和说法 ST公司 MDK5 (Keil5) CubeMX 如何使用MDK5的一些常用功能 MDK5的一些常见的设置 前言与导论 非常感谢2301_77816627-CSDN博客的提问&#xff0c;他非常好奇…...

边缘计算网关与 PLC:注塑机车间数据互联新变革

在当今数字化浪潮席卷而来的时代&#xff0c;制造业的智能化转型成为了提升竞争力的关键路径。对于注塑机车间而言&#xff0c;如何实现数据的高效采集与互联&#xff0c;进而优化生产流程、提高生产效率&#xff0c;是众多企业亟待解决的问题。而明达MBox20边缘计算网关与 PLC…...

LeetCode刷题---哈希表---347

前 K 个高频元素 347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1…...

DataRoom大屏设计器快速上手指南:5步打造专业数据可视化

DataRoom大屏设计器快速上手指南&#xff1a;5步打造专业数据可视化 【免费下载链接】DataRoom &#x1f525;基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器&#xff0c;具备目录管理、DashBoard设计、预览能力&#xff0c;支持MySQL、Oracle、…...

Stable Diffusion加速神器:用DDIM采样算法,让你的AI绘画速度提升10倍(附PyTorch代码)

突破AI绘画速度瓶颈&#xff1a;DDIM采样算法实战指南 在Stable Diffusion等扩散模型席卷创意领域的当下&#xff0c;生成速度成为制约落地的关键因素。当你在深夜等待一张512x512的图片生成时&#xff0c;是否曾盯着进度条陷入沉思&#xff1f;传统DDPM采样需要50-100步迭代&a…...

STM32H743外挂W5500做UDP通信,一个Socket端口如何同时处理多个客户端数据?

STM32H743与W5500实现单Socket多客户端UDP通信的实战解析 在嵌入式网络通信中&#xff0c;UDP协议因其低开销和实时性优势被广泛应用于设备间数据传输。本文将深入探讨STM32H743通过W5500以太网模块实现单Socket端口同时处理多客户端数据的解决方案&#xff0c;相比传统多Socke…...

CPM2AH PLC以太网通讯配置:连接触摸屏与上位机的完整实践

一、行业背景与项目概况1.1 分拣行业技术需求分拣行业作为物流流转、产品加工的关键环节&#xff0c;广泛应用于快递物流、食品加工、电子制造等领域&#xff0c;其核心诉求是实现物料的快速、精准分拣&#xff0c;提升流转效率&#xff0c;降低人工成本。当前分拣企业普遍面临…...

底层算法逆向揭秘:哪些降重软件可以同时降低查重率和AIGC疑似率?2026高效论文降重方案全解析

【CSDN独家硬核长文 / 年度置顶专栏】 博主身份&#xff1a;CSDN百大实力榜博主 / AI安全与大语言模型(LLM)风控研究员 / 硕博避坑指南星推官 版权声明&#xff1a;本文系2026年毕业压测季的最真实黑盒施压数据&#xff0c;未经授权严禁搬运。这是一场为了保住各位毕业双证的“…...

实测对比:三家安卓加固方案防GG修改器的实战效果哪家强?

都说自己的加固方案能防内存修改&#xff0c;但在GG修改器这种“老牌”神器面前&#xff0c;实际效果到底如何&#xff1f;光听销售讲PPT可不行。为了搞清楚这个问题&#xff0c;我以一款普通的Unity游戏Demo为例&#xff0c;对市面上三家典型的安卓安全加固方案进行了一次横向…...

告别样本失衡:用PyTorch手把手实现Focal Loss,让你的目标检测模型更关注‘难啃的骨头’

用Focal Loss解决目标检测中的样本失衡难题&#xff1a;PyTorch实战指南 当你盯着训练日志里那些"虚高"的准确率指标时&#xff0c;是否注意到模型对小目标、遮挡目标的识别率始终低迷&#xff1f;这很可能不是数据标注的问题&#xff0c;而是经典交叉熵损失函数在面…...

别再死磕GPIO了!用STM32的PWM+DMA驱动WS2812灯带,CPU占用率直降90%

STM32实战&#xff1a;PWMDMA驱动WS2812灯带的极致性能优化 在智能家居和物联网设备开发中&#xff0c;绚丽的灯光效果往往能大幅提升产品体验。但当你用STM32的GPIO模拟时序驱动WS2812灯带时&#xff0c;是否遇到过这些困扰&#xff1a;CPU占用率飙升导致传感器数据采集延迟、…...

从零构建极简LLM推理引擎:CUDA优化与Transformer实现详解

1. 项目概述&#xff1a;从零构建一个极简高效的LLM推理引擎 最近在深入学习和实践CUDA与通用GPU计算时&#xff0c;我萌生了一个想法&#xff1a;为什么不从零开始&#xff0c;亲手打造一个大型语言模型的推理引擎呢&#xff1f;这个念头一旦产生就挥之不去。对于任何想在底层…...

终极指南:如何在5分钟内将图片转换为3D打印模型

终极指南&#xff1a;如何在5分钟内将图片转换为3D打印模型 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side. 项目…...