堆的相关时间复杂度计算(C语言)

news2024/7/6 9:42:27

目录

前言

建堆的时间复杂度

向上调整建堆的时间复杂度

向下调整建堆的时间复杂度

维护堆的时间复杂度

top K问题的时间复杂度


前言

        在前面的三篇文章中我们成功的实现了堆排序的升降序以及基于堆的top K问题,现在我们来解决它们的时间复杂度问题

建堆的时间复杂度

关于建堆的时间复杂度计算我们放在了:大小堆的实现(C语言)中讲解

向上调整建堆的时间复杂度

计算方式:此时所处层的结点个数 * 向上调整次数   

文字描述: 假设我们有一个具有 N 个节点的满二叉树,并且我们正在对其中某个节点进行向上调整。在最坏情况下,该节点可能需要一直交换到根节点位置才能满足堆性质。

公式描述:

向上调整建堆到叶子结点时就不再调整,假设向下调整建堆的累计调整次数是T(h),那么:

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

②-①得:

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

由等比数列求和公式得:

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

又由于满二叉树高度h与总结点个数N之间的关系是h = log(N+1),故将④化简可得:

T(N) =  -N + (N+1)(log(N+1)-1) + 1

因此,向上调整建堆的时间复杂度为:O(N*logN)

向下调整建堆的时间复杂度

假设该堆为满二叉树,此时向下调整的情况是最坏的情况:

计算方式:此时所处层的结点个数 * 向下调整次数  

文字描述:假设有一个具有 N 个元素的完全二叉树(即堆),其中 h 是该二叉树的高度。在最坏情况下,需要将一个元素从根节点向下移动到底部层次,并且每一次都需要与其子节点进行比较和交换操作。 

公式描述:

向下调整建堆到叶子结点时就不再调整,假设向下调整建堆的累计调整次数是T(h),那么:

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

②-①得:

T(h) = 2^(h-1) + 2^(h-2)  + ...... + 2^1 + 2^0 - h     ③

由等比数列求和公式得:

T(h) = 2^h - 1 -h     ④

又由于满二叉树高度h与总结点个数N之间的关系是h = log(N+1),故将④化简可得:

T(N) =  N - log(N+1)

因此,向下调整建堆的时间复杂度为:O(N) 

结论:向下调整建堆的时间复杂度为O(N),向上调整建堆的时间复杂度为O(N*logN),因此更倾向于使用向下调整的方式建堆

向下调整向下调整建堆时间复杂度分别为O(logN)O(N)

维护堆的时间复杂度

//维护
int end = n - 1;
while (end > 0)
{
	Swap(&a[0], &a[end]);
	AdjustDown(a, end, 0);
	--end;
}

维护堆的时间复杂度为O(N*logN)

文字描述:

假设数组 a 的长度为 n,则循环会执行 n-1 次迭代,每次迭代都包括以下几个步骤:

  1. 交换首尾元素:通过调用 Swap 函数交换数组首尾元素,所需时间复杂度为 O(1)

  2. 向下调整:向下调整的时间复杂度为O(logN)

  3. 更新结束标志:将结束标志 end 减一,表示缩小待处理区间,所需时间复杂度为 O(1)

因此,时间复杂度O(n) = (N-1)logN = N*logN

公式描述:

在满二叉树中的总结点个数N为:
N = (2^0) + (2^1) + ... + 2^(h-1)

由等比数列求和公式得到:
N = (2^h - 1)

因此堆高度 h 与结点总数N的关系为:
h = log(N + 1)

最坏情况下,一个元素需要一直向下移动到叶子节点,此时它经过堆高度上所有层级:

所以时间复杂度为O(logN)

补充:时间复杂度计算的是输入规模与算法最坏执行时间之间的关系,在向下调整操作中,时间复杂度计算了堆的总结点个数 N 与一个结点最坏的调整次数所需的时间,这个时间又与结点的高度h有关而h=log(N+1),所以O(N) = log(N+1) = log(N)

top K问题的时间复杂度

文字描述:

利用堆解决top K问题可以分为两个阶段:

  1. 建立初始大小为 K 的最小堆:需要插入 K 个元素到空的初始堆中。每次插入操作都需要执行一次向上调整操作,时间复杂度为 O(logK)
    因此,在建立初始大小为 K 的最小堆时所需总比较和交换次数是 O(KlogK)

  2. 处理剩余 N-K 个元素:对于每个剩余元素,如果它大于当前最小值(即根节点),则替换并执行向下调整操作,以维护最新的 top k 元素,每次替换和向下调整都需要花费 O(logK) 的时间。
    因此,在处理剩余 N-K 个元素时所需总比较和交换次数是 O((N-K)logK)

因此,使用堆解决 Top K 问题的时间复杂度为 O(KlogK + (N-K)logK),其中 N 是输入元素的总数。如果 K 远小于 N,则该算法的时间复杂度可近似为 O(NlogK),因为 K 的值相对较小可忽略不计。

~over~

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

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

相关文章

【精选】 VulnHub (超详细解题过程)

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

前后端请求之nginx配置

问题: 前端发送的请求,是如何请求到后端服务器的? 如,前端请求地址:http://loclhost/api/employee/login: 后端相应请求地址:http://loclhost:8080/admin/employee/login 回答: …

Firmware Analysis Plus (Fap)固件模拟安装教程(最新)

最近在搞IoT的研究,但是难在设备比较难弄,只有固件,而没有设备,买吧,又太费钱,不划算。好在有很多项目可以在模拟环境中运行固件。但是几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同。 …

Idea spring项目中 resource图标错误解决方案

1.resources错误显示示例 2.resources正确显示示例 3.解决方案 第一步: 第二步: 点击完成即可。

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9科研

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9 (源自星戈瑞) ATH686 FLT3 抑制剂 853299-52-2 Pelitrexol 抑制剂 446022-33-9 TBT1 转运蛋白抑制剂 52535-76-9 HFY-4A HDAC 抑制剂 2094810-82-7 SDR-04 BET 抑制剂 879593-54-1 Phthala…

Java项目-瑞吉外卖Day3

填充公共字段: 目的:由于某些属性,例如createdTime这些需要填充的字段会在多个地方出现,所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略,是插入/更新的时候…

国内大厂机器人赛道产品

大疆 大疆无人机自然不必说,除此之外大疆搞机甲大师,教育机器人。 字节 当前字节在机器人领域只是初步探索阶段,目前尚未发布相关产品(截止至23.12)。 管理层想法: 跟已有业务做结合,服务好…

机器学习之全面了解回归学习器

我们将和大家一起探讨机器学习与数据科学的主题。 本文主要讨论大家针对回归学习器提出的问题。我将概要介绍,然后探讨以下五个问题: 1. 能否将回归学习器用于时序数据? 2. 该如何缩短训练时间? 3. 该如何解释不同模型的结果和…

Swift “黑魔法”之动态获取类实例隐藏属性的值

概览 在 Swift 代码的调试中,我们时常惊叹调试器的无所不能:对于大部分“黑盒”类实例的内容,调试器也都能探查的一清二楚。 想要自己在运行时也能轻松找到 Thread 实例“私有”属性的值吗(比如 seqNum)? 在本篇博文中您将学到如下内容: 概览1. 借我,借我,一双慧眼吧…

重磅!2023中国高校计算机大赛-人工智能创意赛结果出炉

目录 中国计算机大赛-人工智能创意赛现场C4-AI大赛颁奖及留影800个AI应用?这届大学生真能“搞事情”AI原生时代,百度要再培养500万大模型人才 中国计算机大赛-人工智能创意赛现场 12月8日,杭州,一位“白发老人”突然摔倒在地&…

UIUC北大最新工作Radarize:室内环境大规模雷达SLAM

0. 笔者个人体会 相对视觉和LiDAR SLAM来说,基于Radar的SLAM较为小众。但视觉SLAM对光照和低纹理区域敏感,在室内使用还有隐私问题。LIDAR SLAM在长走廊、雾烟尘等退化环境效果不好。所以在一些专用领域,Radar SLAM还是有不可替代的价值。 今天笔者将为大家分享伊利诺伊大学…

Web网站服务(二)

1、客户机地址限制。 Require all granted&#xff1a;表示允许所有主机访问。 Require all denied&#xff1a;表示拒绝所有主机访问。 Require local&#xff1a;表示仅允许本地主机访问。 Require [not] host <主机名或域名列表>&#xff1a;表示允许或拒绝指定主机或…

RabbitMQ反序列化未经授权的类异常解决方案

配置好生产者消费者后&#xff0c;消费者项目启动后出现如下异常&#xff1a; Caused by: java.lang.SecurityException: Attempt to deserialize unauthorized 这是反序列化未经授权的类&#xff0c;解决办法是设置信任所有消息发起者&#xff0c;可以将环境变量&#xff1a; …

day40-43-Vue2.js-路由VueRouter-Vuex状态管理-Axios异步

今日内容 零、 复习昨日 一、Vue简介 1.1 简介 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式的js框架&#xff0c;发布于 2014 年 2 月。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#x…

Windows Terminal的半透明效果

打开Windows Terminal的半透明效果 最终实现效果&#xff1a; 系统&#xff1a;win11 23H2 步骤&#xff1a; 1.winx打开终端 2.右键打开设置 3.打开外观->亚克力材料开启 4.默认值->外观->透明度&#xff0c;按喜好选择即可

018 OpenCV 人脸检测

目录 一、环境 二、分类器原理 2.1、概述 2.2、工作原理 三、人脸检测代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、分类器原理 CascadeClassifier是OpenCV&#xff08;开源计算机视觉库&#xff09;中的一个强大的类…

【论文解读】Accelerating motion estimation by genetic algorithm approach in x265

时间&#xff1a;2018 级别&#xff1a;SCI 机构&#xff1a;College of Engineering Pune 摘要&#xff1a; 在过去 20 年&#xff0c;在视频编码和压缩领域&#xff0c;研究人员提出了几种减少运动估计的计算量和时间的技术&#xff0c;本文提出了一种基于遗传算法初始种群确…

一篇文章带你全面了解Web UI自动化测试之元素定位

前言 目前&#xff0c;在自动化测试的实际应用中&#xff0c;接口自动化测试被广泛使用&#xff0c;但UI自动化测试也并不会被替代。让我们看看二者的对比&#xff1a; 接口自动化测试是跳过前端界面直接对服务端的测试&#xff0c;执行效率和覆盖率更高&#xff0c;维护成本…

小程序一键生成工具哪个好?

在这个数字化时代&#xff0c;小程序已经成为商家吸引客户、提升业务的重要工具。但是&#xff0c;传统的小程序开发方式既费时又费力&#xff0c;让许多商家望而却步。 现在&#xff0c;有了乔拓云小程序模板开发平台&#xff0c;一切都变了。 乔拓云提供了大量精心设计的模板…