数据结构-二叉树-堆(二)

news2024/11/25 2:27:35

一、建堆的时间复杂度问题

1、除了向上调整建堆,我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走,可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数的第一个的非叶子开始调整。也就是最后一个叶子的父亲节点开始向下调整建堆。一层一层向上进行向下调整建堆,把大的数字往上调小的数字往下沉。那么问题来了怎么找到最后一个叶子的父亲节点。

我们先可以求出最后一个孩子的下标然后应用公式 parent = (child-1)/ 2 算出最后一个孩子的父亲节点的下标。

void HeapSort(int* a,int n)
{
	//首先建立大堆
	/*for (int i = 1; i < n; i++)
	{
		UpAdjust(a, i);
	}*/

	//向下调整建堆的效率要比向上调整建堆的效率要高
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		DownAdjust(a, i, n);
	}

	//交换堆头和堆尾的数字选出最大的数字放到堆尾
	//然后向下调整
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[end], &a[0]);
		DownAdjust(a, 0, end);
		end--;
	}
}

2、向下调整和向上调整建堆的时间复杂度

向下调整:倒数第二层有2^(h-2) 个节点

建堆的调整的次数

错位相减法算出时间复杂度

每层节点个数 × 这一层最坏向下调整多少次

最后的结果为:

所以时间复杂度为O(N)  T(N) = N - h。

向上调整:

再次使用上面的错位相减法

所以时间复杂度为O(NlogN)。

因为向下调整的过程中节点多的调整的次数少,节点少的调整的次数多。向上调整的过程中节点少的调整的次数少,节点多的调整的次数多

排序调堆的时间复杂度也是O(NlogN)。

TOPK 问题

1、建N个数的大堆,再Pop k次就可以了。

2、加入N很大呢?N是100亿呢? K == 50

      1G大约十亿字节。所以是40G左右

内存中存不下,数据是在磁盘文件中。

我们可以用100亿个数中的K个数建立一个小堆。遍历剩下的数据,如果这个数据比堆顶的数据大,就替代它进堆(向下调整)最后这个小堆的数据就是最大的前K个。

void HeapTopK(int* a, int n, int k)
{
	//首先向下调整建堆
	int* topk = (int*)malloc(sizeof(int) * k);
	//从a数组里读
	for (int i = 0; i < k; i++)
	{
		topk[i] = a[i];
	}
    //建立小堆
	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
	{
		DownAdjust(topk, i, k);
	}
	//遍历剩下的数如果大于堆顶的数据我们就让它进堆并向下调整
	for (int i = k + 1; i < n; i++)
	{
		if (a[i]  > topk[0])
		{
			topk[0] = a[i];
			DownAdjust(topk, 0, k);
		}
	}
}

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

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

相关文章

【C++杂货铺】多态

目录 &#x1f308;前言&#x1f308; &#x1f4c1;多态的概念 &#x1f4c1; 多态的定义及实现 &#x1f4c2; 多态的构成条件 &#x1f4c2; 虚函数 &#x1f4c2; 虚函数重写 &#x1f4c2; C11 override 和 final &#x1f4c2; 重载&#xff0c;覆盖&#xff08;重写…

VBA技术资料MF145:清空回收站

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

六、项目发布-- 3. Node.js+express 编写书城首页API

前面那些准备工作做完之后&#xff0c;现在我们就具体来用Node.js来写一个简单的API 基本API编写&#xff1a; 建个后端文件夹&#xff0c;放到vscode打开 我们之前的代码都是前端代码&#xff0c;现在我们来做一个后端的代码。新建一个新的文件夹叫node_new_book&#xff0…

二 SSM整合实操

SSM整合实操 一 依赖管理 数据库准备 mysql8.0.33 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUE…

数字旅游:通过科技赋能,创新旅游服务模式,提供智能化、个性化的旅游服务,满足游客多元化、个性化的旅游需求

目录 一、数字旅游的概念与内涵 二、科技赋能数字旅游的创新实践 1、大数据技术的应用 2、人工智能技术的应用 3、物联网技术的应用 4、云计算技术的应用 三、智能化、个性化旅游服务的实现路径 1、提升旅游服务的智能化水平 2、实现旅游服务的个性化定制 四、数字旅…

可视化+多人协同技术原理和案例分享

前言 hi&#xff0c;大家好&#xff0c;我是徐小夕&#xff0c;之前和大家分享了很多可视化低代码的技术实践&#xff0c;最近也做了一款非常有意思的文档搭建引擎——Nocode/Doc&#xff1a; 也做了一些分享&#xff1a; Nocode/Doc&#xff0c;可视化 零代码打造下一代文件编…

Flink学习(八)-Flink 集群搭建

1&#xff0c;准备三台机器 装好 jdk 等必要的组件。 注意&#xff0c;由于本身没有额外的 dns做转发。因此&#xff0c;需要在每台机器的 host 文件里&#xff0c;配置好相关 ip 具体方法 vim /etc/hosts 2&#xff0c;flink做配置 2.1 资源规划 节点服务器 node01 nod…

VScode Failed to parse remote port from server output

在使用VScode 在连接AutoDL 过程中一直连接不上&#xff0c;显示 Failed to parse remote port from server output 在网上查了很多资料&#xff0c;貌似的没啥用。和我有相同 error 的可以尝试修改setting.json 文件。 添加这条命令&#xff08;我的json文件里面没有&#…

Spring Cloud OpenFeign 开启 httpclient5

环境介绍 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 knife4j &#xff1a; 4.4.0 开始工作 pom文件引入配置 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-start…

探索设计模式的魅力:AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;AI赋能分层模式&#xff0c;解构未来&#xff0c;智领风潮 ✨欢迎…

【优秀AI项目】每日跟踪 OpenVoice ,AI快站,OpenVoice

持续更新好玩的开源AI项目或AI商业应用体验 一起来玩转AI&#xff01;&#xff01; 1 huggingface 国内镜像站&#xff1a;AI 快站 HUggingface被墙了&#xff0c;emmmmm 所以我之前玩模型的一大感觉就是 下载什么模型之类的太难受了&#xff01;服了 看到一个镜像站——…

leetcode1143. 最长公共子序列(ACM模式解法)

题目描述 给你一个序列X和另一个序列Z&#xff0c;当Z中的所有元素都在X中存在&#xff0c;并且在X中的下标顺序是严格递增的&#xff0c;那么就把Z叫做X的子序列。 例如&#xff1a;Z是序列X的一个子序列&#xff0c;Z中的元素在X中的下标序列为<1,2,4,6>。 现给你两个…

HarmonyOS-Next开源三方库 MPChart:打造出色的图表体验

点击下载源码https://download.csdn.net/download/liuhaikang/89228765 简介 随着移动应用的不断发展&#xff0c;数据可视化成为提高用户体验和数据交流的重要手段之一。在 OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;应用开发中&#xff0c;一个强大而…

边缘计算在视频监控领域的应用

一、边缘计算在视频监控领域的应用 运用边缘计算解决视频监控问题&#xff0c;可以带来许多优势。以下是一些具体的应用示例&#xff1a; 实时分析与处理&#xff1a;在视频监控系统中&#xff0c;边缘计算盒子可以实时处理和分析视频流&#xff0c;实现对监控画面的智能识别…

2024电子、电路与控制工程国际学术会议(IACECIE2024)

2024电子、电路与控制工程国际学术会议&#xff08;IACECIE2024) 会议简介 2024年国际电子、电路与控制工程学术会议&#xff08;IACCECIE2024&#xff09;将于2024年在重庆隆重举行。本次会议汇集了来自全球电子、电路和控制工程领域的杰出学者、研究人员和行业代表&#…

底层逻辑(1) 是非对错

底层逻辑(1) 是非对错 关于本书 这本书的副标题叫做&#xff1a;看清这个世界的底牌。让我想起电影《教父》中的一句名言&#xff1a;花半秒钟就看透事物本质的人&#xff0c;和花一辈子都看不清事物本质的人&#xff0c;注定是截然不同的命运。 如果你看过梅多丝的《系统之美…

Power BI数据刷新 - 网关 数据源凭据详解

众所周知&#xff0c;如果在Power BI云服务中设置数据源自动刷新&#xff0c;有两种方式供你选择, 分别是&#xff1a; Gateway and cloud connections&#xff08;网关和云连接&#xff09;&#xff1b;Data Source Credentials&#xff08;数据源凭据&#xff09;&#xff1…

Linux——NFS网络文件系统

在生产环境中共享宿主目录可以用于集中管理账户 一、存储设备 DAS 是直连存储相当于移动硬盘 NAS 是网络文件系统&#xff0c;挂载后可以直接访问 SAN 存储区域网络 IPSAN 网线连接 共享的是设备&#xff0c;需要挂载后分区使用 FCSAN 光纤连接 二、服务的管理 1、安…

如何在PostgreSQL中创建一个新的数据库,并指定所有者?

文章目录 解决方案示例代码 PostgreSQL是一个强大的开源关系型数据库管理系统&#xff0c;它允许用户创建和管理多个数据库。在PostgreSQL中创建一个新的数据库并指定所有者是一个常见的操作。下面&#xff0c;我们将详细解释如何执行这一操作&#xff0c;并提供示例代码。 解…

OpenHarmony鸿蒙南向开发案例:【智能加湿器】

样例简介 智能加湿器具有实时监控其所处环境温度、湿度&#xff0c;并通过数字管家设置日程&#xff0c;自动打开加湿器控制湿度功能。显示界面使用DevEco Studio 编写的js应用&#xff0c;具有很好的兼容和移植特性。硬件上采用了带有HDF框架的驱动模型&#xff0c;通过GPIO和…