堆的时间复杂度分析

news2024/11/26 5:42:46

一,建堆的时间复杂度分析

堆是一颗完全二叉树,满二叉树又是一颗特殊的完全二叉树。

对于满二叉树来说,第一层的节点个数为2^0,第二层的节点个数为2^1,......所以可以得到第h层的节点个数为2^(h-1)。总结点个数N=2^0+2^1+...+2^(h-1)=2^h-1。那么就可以得出高度和节点个数的关系h=log(N+1)。

对于完全二叉树来说,最少情况下是上图中,最后一层只有一个节点,最多情况就是一个满二叉树。最少情况下,N=2^0+2^1+...+2^(h-2)+1=2^(h-1),同样高度和节点个数的关系:h=logN+1;

向上调整建堆和向下调整建堆的算法(内容在上一节中),最坏情况下都是要调整高度次,所以时间复杂度都是O(logN).

二,堆排序的时间复杂度分析

堆排序的大致思路:先将数据建堆(有4,),再将堆顶数据和最后一个数据交换,将除最后一个数据外的剩下数据重新建堆,反复执行,最大或最下的数据就会被放在后面,最后就得到一组有序数据。

//堆排序
void HeapSort(int* a, int n)
{
	//升序,建大堆
	//降序,建小堆

	//向下调整建堆
	//从第一个非叶子节点开始
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	int end = n - 1;

	while (end > 0)
	{
		swap(&a[0], &a[end]);//交换
		AdjustDown(a, end, 0);//重新建堆
		end--;
	}
}
1,使用向下调整建堆

可能在只看代码时,会认为一个for循环,加上向下调整算法,时间复杂度是O(N*logN),其实不然,时间复杂度是O(N)。

向下调整建堆的思路:从第一个非叶子节点开始,使用向下调整算法,使它的左右子树都调成大堆或者小堆,依次循环。

 

时间复杂度分析: 

第一层有2^0个节点,每个节点最多向下调整h-1次。

第二层有2^1个节点,每个节点最多向下调整h-2次。

第三层有2^2个节点,每个节点最多向下调整h-3次。

......

第h-1层有2^(h-2)个节点,每个节点最多向下调整1次。

最多需要调整的次数

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

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

相减得:F(h)=2^(h-1)+2^1+2^2+...+2^(h-2)-2^0*(h-1)

最后得:F(h)=2^h-1-h,再将h=logN代入:

F(h)=N-1-logN.(N的量级大于logN的量级)

所以向下建堆的时间复杂度为O(N)

2,使用向上调整建堆

向上调整建堆与向下相比,时间复杂度会更高。

//堆排序
void HeapSort(int* a, int n)
{
	//升序,建大堆
	//降序,建小堆
	//向上调整建堆
	for (int i = 1; i < n; i++)
	{
		AdjustUp(a, i);
	}
	int end = n - 1;

	while (end > 0)
	{
		swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		end--;
	}
}

向上调整建堆的思路:将第一个数据看成是堆,从第二个数据开始,调用向上建堆算法,入一个数据,调用一次建堆。

时间复杂度分析:(从第二行开始)

第二行2^1个数据,每个数据向上调整1次

第三行2^2个数据,每个数据向上调整2次

......

第h行2^(h-1)个数据,每个数据向上调整h-1次

最多需要调整的次数:T(h)=2^1*1+2^2*2+...+2^(h-1)*(h-1)

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

相减得:T(h)=2^h*(h-1)-2^1-(2^2+2^3+...+2^(h-1))

             T(h)=2^h*(h-1)-2^h+2

得:T(h)=(N+1)*(log(N+1)-1)-N+1

这个公式看最后一项就可以看出时间复杂度是O(N*logN),因为最后一行有2^(h-1)个节点,占整颗树节点的一半,还要调整h-1次。

3,比较

其实不难看出,向下建堆过程中,规律是:节点数量多的层*调整次数少,节点数量少得层*调整次数多。

向上建堆过程就相反,节点数量多的层*调整次数多,节点数量少得层*调整次数少。

所以向下调整建堆得时间复杂度更低。堆排序中用的也就是向下调整建堆。

4,重新建堆过程时间复杂度
while (end > 0)
{
	swap(&a[0], &a[end]);
	AdjustDown(a, end, 0);
	end--;
}

该过程是将建好的堆进行调整,交换堆顶数据和最后一个数据,然后将最后一个数据除外,重新形成一个堆,反复执行,使数据变得有序。

时间复杂度分析:

该过程每次都要调整,都是从第一个节点位置开始,N个节点,最多调整logN次,在加上一次循环,最多调整N*logN次。

该过程的时间复杂度是O(N*logN) 

堆排序的时间复杂度为:O(N*logN)+O(N), 其中N*logN的量级更大

总结:堆排序的时间复杂度为O(N*logN)

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

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

相关文章

桌面日历工具

Desktop Calendar 官网 设置安装目录&#xff0c;防止默认装到C盘修改为自己想要安装的位置调整位置和大小

ip地址变化是什么意思?手机地址ip一直变化怎么办

IP地址作为互联网设备的唯一标识&#xff0c;‌其稳定性对于网络连接至关重要。‌然而&#xff0c;‌手机IP地址频繁变动可能带来一系列问题。‌本文将深入探讨IP地址变化的含义、‌IP地址频繁变动的原因&#xff0c;‌以及提供手机地址IP一直变化的有效应对策略。‌ 一、IP地址…

申请商标及版权时千万要注意字体!

近日有个渠道合作的朋友申请版权&#xff0c;就是几行文字&#xff0c;普推知产老杨一看这个字体有点特别&#xff0c;不是免费字体&#xff0c;一问也不是他们美工自己设计&#xff0c;是在网上找的字体&#xff0c;一检索果然是商业字体&#xff0c;赶紧建议换字体。 以前经常…

list类底层逻辑实现

list的底层逻辑是一个双向带头链表。那么list的底层其实就跟我们之前实现的带头双向链表相同&#xff0c;都是开辟一个一个单独的节点&#xff0c;最后再通过指针将各个单独的节点链接起来即可。 我们来类比之前编写的双向带头链表实现具体的内容。 创建一个list类的主体 就像我…

一个浏览器插件如何月入12万美元:深入了解 GoFullPage

一个浏览器插件如何月入12万美元&#xff1a;深入了解 GoFullPage 前言 GoFullPage 这个插件的诞生&#xff0c;源于其创作者 Peter Coles 的一个简单想法&#xff1a;解决一个他在日常开发工作中遇到的痛点。早在 2012 年&#xff0c;Coles 发现许多现有的网页截图工具无法完…

Qt 多个按钮,响应同一个点击事件

最近的一个需求&#xff0c;需要多个按钮响应同一个点击事件&#xff0c;并且要求能区分是哪个按钮点击的&#xff0c;看效果&#xff1a; 直接上代码&#xff1a; QList<QPushButton*> buttons findChildren<QPushButton*>();for (QPushButton* button : buttons…

Centos Stream9系统安装及网络配置详解

1.镜像下载 如未拥有系统镜像文件的伙伴可通过前往下面的连接进行下载&#xff0c;下载完成后需将其刻录至U盘中。 PS&#xff1a;该U盘应为空盘&#xff0c;刻录文件会导该盘格式化&#xff0c;下载文件选择dvd1.iso完整包&#xff0c;适用于本地安装。 下载地址&#xff1…

波导阵列天线单元学习笔记7 一种用直接金属激光烧结考虑的轻质量,宽带,双圆极化波导腔体阵列

摘要&#xff1a; 提出了一种工作在Ku频段的轻质量&#xff0c;宽带&#xff0c;双圆极化波导腔体阵列。为了获得双正交的线极化&#xff0c;基本的辐射单元是由两个波导馈电的方形腔体。通过恰当地对馈网进行调谐&#xff0c;可以获得对于两个正交极化的等辐同相辐射电场&…

学习之MySQL约束

概述 1、概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据 2、目的&#xff1a;保证数据库中数据的正确性&#xff0c;有效性和完整性 3、分类&#xff1a; 注意&#xff1a;约束是作用域表中字段上的&#xff0c;可以创建表/修改表的时候…

jenkins安装k8s插件发布服务

1、安装k8s插件 登录 Jenkins&#xff0c;系统管理→ 插件管理 → 搜索 kubernetes&#xff0c;选择第二个 Kubernetes&#xff0c;点击 安装&#xff0c;安装完成后重启 Jenkins 。 2、对接k8s集群、申请k8s凭据 因为 Jenkins 服务器在 kubernetes 集群之外&#xff0c;所以…

华为云征文|部署个人博客管理系统 Ghost

华为云征文&#xff5c;部署个人博客管理系统 Ghost 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 对比普通ECS 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Ghost3.1 Ghost 介绍3.2 Docker 环境搭建3.3 Ghost 部署3.4 Gho…

同时学习C++和Java,会如何

在当今信息时代&#xff0c;编程语言如同人类的语言&#xff0c;是沟通机器的桥梁。 而随着技术的不断发展&#xff0c;编程语言种类繁多&#xff0c;选择哪种语言学习成为了许多人面临的难题。 有人建议专注于一门语言&#xff0c;精益求精&#xff0c;而也有人主张同时学习多…

Windows连接虚拟机中的mysql5失败

Windows连接虚拟机中的mysql5失败 虚拟机版本为centos6.8&#xff0c;数据库版本为mysql5.6&#xff0c;系统版本为window11。在虚拟机上安装好mysql&#xff0c;并且配置好权限&#xff0c;虚拟机登录正常之后。在windows11上使用工具dbeaver连接mysql失败&#xff0c;报错 Co…

春秋云镜(ZZCMS 2023)·CVE-2023-50104

漏洞参考说明&#xff1a;GitHub - zzq66/cve4 漏洞复现&#xff1a; 1、访问 URL/3/E_bak5.1/upload/index.php 2、使用默认账户密码admin/admin登录 3、上传恶意语句 修改tablename字段为eval($_POST[1]) POST /3/E_bak5.1/upload/phomebak.php HTTP/1.1 Host: eci-2zehp12…

黄仁勋预言步入现实 谷歌展示实时游戏生成AI模型GameNGen

由AI模型实时生成游戏的时代&#xff0c;已经悄然来到了我们身边。本周来自谷歌公司和特拉维夫大学的研究人员发表了一篇名为《Diffusion模型是实时游戏引擎》的论文&#xff0c;介绍了计算机历史上第一个完全由神经网络模型支持的游戏引擎GameNGen。 研究人员在论文中写道&…

51单片机.之蜂鸣器振动播放歌曲

蜂鸣器发声是通过喇叭振动发声的&#xff0c;通电产生磁场&#xff0c;磁铁吸收&#xff0c;而振动。不断释放&#xff0c;吸收。 1、蜂鸣器发声&#xff0c;播放不同频率的声音逐渐变尖 #include<reg52.h>sbit BUZZ P1^6;unsigned char T0RH0; unsigned char T0RL0; v…

七、性能测试

文章目录 一、常见的性能测试二、为什么要进行性能测试三、性能测试实施的流程&#xff08;一&#xff09;如何确定性能测试的需求1.关键性能指标分析2.关键业务分析 &#xff08;二&#xff09;常见的性能指标 三、性能测试定义四、性能测试关键指标&#xff08;一&#xff09…

论文笔记:Estimating future human trajectories from sparse time series data

sigspatial 2023 humob竞赛paper hiimryo816/humob2023-MOBB (github.com) 1 数据集分析 这里只分享了HuMob数据集1的内容 1.1 假日分析 对HuMob数据集#1地理数据的方差分析显示了非工作日的模式 在某些天的y坐标方差中有显著的峰值&#xff0c;这是非工作日的象征【x坐标…

写给LLM新手的建议,让你少走2年弯路!

大模型的爆火&#xff0c;在全球范围内引发了一场A1“狂也在业界点燃了一场百模大战。结合蕞近飙”&#xff0c;两年我在大模型领域的一些经验&#xff0c;分享一下在校学生/新人如何转到大模型阵营。 1、大模型有哪些从业方向? 首先你可以在求职网站搜索一下“大模型关键词&…

重卡智能充电机器人

产品介绍 随着新能源电池行业的发展&#xff0c;越来越多码头、矿山等场景的重型卡车都改为新能源供电形式&#xff0c;由于新能源重卡充电电压为1.2MW&#xff0c;充电口离地1.8m&#xff0c;充电枪充电线缆重量为50kg&#xff0c;人工操作难度大、危险性大&#xff0c;所以我…