学习数据结构(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)),效率高于冒泡排序

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

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

相关文章

​实在智能与宇树科技、云深科技一同获评浙江省“人工智能服务商”、 “数智优品”​等荣誉

近日&#xff0c;浙江省经信厅正式公布《2024 年浙江省人工智能应用场景、应用标杆企业、人工智能服务商及 “数智优品” 名单》。 实在智能获评浙江省“人工智能服务商”&#xff0c;核心产品 “实在 Agent 智能体” 入选 “数智优品”。一同获此殊荣的还有宇树科技、云深处科…

Redis7——基础篇(五)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

矿用机车移动逆变电源设计(论文+源码)

1总体方案设计 本课题为矿用机车移动逆变电源的硬件电路设计&#xff0c;其整个架构如图2.1所示包括了:380V三相交流电&#xff0c;逆变电路&#xff0c;高频变压器&#xff0c;24V直流输出&#xff0c;控制电路&#xff0c;驱动电路&#xff0c;保护电路等等。 在工作原理上&…

深入浅出:0 - 1 背包问题的滚动数组解法

目录 一、引言二、0 - 1 背包问题概述2.1 问题定义2.2 具体示例 三、动态规划与滚动数组思路3.1 二维动态规划思路3.2 滚动数组优化思路 四、具体分析全过程4.1 初始化 dp 数组4.2 考虑物品 0&#xff08;重量为 1&#xff0c;价值为 15&#xff09;4.2.1 当 j 44.2.2 当 j 3…

spring学习(spring容器、加载配置文件方式、获取bean的方式)

目录 一、加载spring配置文件的几种方式。 &#xff08;0&#xff09;工程文件初始化。 &#xff08;1&#xff09;加载类路径下的配置文件。&#xff08;常见&#xff09; &#xff08;2&#xff09;加载文件绝对路径的配置文件。 &#xff08;3&#xff09;加载多个配置文件。…

DeepSeek-R1论文阅读及蒸馏模型部署

DeepSeek-R1论文阅读及蒸馏模型部署 文章目录 DeepSeek-R1论文阅读及蒸馏模型部署摘要Abstract一、DeepSeek-R1论文1. 论文摘要2. 引言3. DeepSeek-R1-Zero的方法3.1 强化学习算法3.2 奖励建模3.3 训练模版3.4 DeepSeek-R1-Zero的性能、自进化过程和顿悟时刻 4. DeepSeek-R1&am…

华为动态路由-OSPF-骨干区

华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组&#xff08;IETF&#xff09;定义的标准之一&#xff0c;被广…

RocketMQ - 常见问题

RocketMQ常见问题 文章目录 RocketMQ常见问题一&#xff1a;消息幂等问题1&#xff1a;什么是消费幂等2&#xff1a;消息重复的场景分析2.1&#xff1a;发送时消息重复2.2&#xff1a;消费时消息重复2.3&#xff1a;Rebalance时消息重复 3&#xff1a;通用解决方案3.1&#xff…

MySQL登录问题总结

不管何种数据库&#xff0c;使用的第一步都是先登录。 MySQL命令行登录语句&#xff1a;mysql -u username -P port -p -D database_name 登录MySQL的报错一般从报错信息都能得到反馈&#xff0c;常见报错原因分析如下&#xff0c;实例中的以test用户为例&#xff0c;登录环境为…

《千恋万花》无广版手游安卓苹果免费下载直装版

自取https://pan.xunlei.com/s/VOJS77k8NDrVawqcOerQln2lA1?pwdn6k8 《千恋万花》&#xff1a;柚子社的和风恋爱杰作 《千恋万花》&#xff08;Senren * Banka&#xff09;是由日本知名美少女游戏品牌柚子社&#xff08;Yuzusoft&#xff09;于2016年推出的一款和风恋爱题材…

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

“谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!” 本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法…

C++ Primer 类的作用域

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

如何在 VS Code 中快速使用 Copilot 来辅助开发

在日常开发中&#xff0c;编写代码往往是最耗时的环节之一。而 GitHub Copilot&#xff0c;作为一款 AI 编码助手&#xff0c;可以帮助开发者 自动补全代码、生成代码片段&#xff0c;甚至直接编写完整的函数&#xff0c;大幅提升编码效率。那么&#xff0c;如何在 VS Code 中快…

剑指 Offer II 024. 反转链表

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20024.%20%E5%8F%8D%E8%BD%AC%E9%93%BE%E8%A1%A8/README.md 剑指 Offer II 024. 反转链表 题目描述 给定单链表的头节点 head &#xff0c;请反转链表&#xff…

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考&#xff08;windows 部署安装 大模型 DeepSeek-R1&#xff09; 那么实际使用中需要开启API模式&#xff0c;这样可以无拘无束地通过API集成的方式&#xff0c;集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…

【产品经理】需求分析方法论+实践

阐述了需求分析的基本认知&#xff0c;包括需求分析的定义、原则和内容。接着&#xff0c;文章详细介绍了需求分析的十个步骤&#xff0c;从收集需求到结果评审&#xff0c;为产品经理提供了清晰的操作指南。 作为产品经理&#xff0c;需求分析是一个最基本的工作&#xff0c;但…

【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)

《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…

2025年02月19日Github流行趋势

项目名称&#xff1a;OmniParser 项目地址url&#xff1a;https://github.com/microsoft/OmniParser 项目语言&#xff1a;Jupyter Notebook 历史star数&#xff1a;12878 今日star数&#xff1a;2153 项目维护者&#xff1a;yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kr…

侯捷 C++ 课程学习笔记:设计模式在面向对象开发中的应用

在侯捷老师的《C 面向对象开发》课程中&#xff0c;除了对面向对象编程的基础特性&#xff08;封装、继承和多态&#xff09;的深入讲解外&#xff0c;还引入了设计模式这一高级主题。设计模式是面向对象编程中的一种最佳实践&#xff0c;能够帮助开发者解决常见的设计问题&…

前七章综合练习

一&#xff0c;拓扑图 二&#xff0c;实验要求 不限 三&#xff0c;实验步骤 第一步&#xff0c;搭建拓扑图 如上 注意&#xff1a; 第二步&#xff0c;配置IP trust&#xff1a; client1 client2 fw untrusrt-1&#xff1a; fw r3 电信DNS 百度web-1 untrust-2&#xf…