堆的时间复杂度分析

2024-09-01 03:04
文章标签 分析 复杂度 时间

本文主要是介绍堆的时间复杂度分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

对于满二叉树来说,第一层的节点个数为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.chinasem.cn/article/1125762

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06