数据结构初阶 堆的问题详解(三)

news2024/12/23 18:00:49

题目一

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )

A 11
B 10
C 8
D 12

我们有最大的节点如下

假设最大高度为10 那么它的最多节点应该是有1023

假设最大高度为9 那么它的最多节点应该是 511

所以说这一题选B

题目二

5.一个具有767个节点的完全二叉树,其叶子节点个数为()

A 383
B 384
C 385
D 386

还是一样 我们假设0度(叶节点)为X0 1度为X1 二度的为X2

根据前面得到的结论

X2 = X0 - 1

我们有

2X0 -1 + X1= 767

2X0 = 768 - X1

这个时候的X1为0

所以说叶节点的个数为384

该题选B

题目三 TOP K 问题

在N个数中找最大的前K个

解法一

排序 这个很简单了 就不多题 一个快排就搞定了

解法二

将N个数依次插入到大堆中 POPK次 就能取到最大的数

解法三

当我们需要寻找的数特别大的时候 比如说这个数是十个亿

十个亿就是四十亿个字节

大概就是4个G左右的内存

这样子的内存就直接否了解法一和解法二

我们创建一个K个数的小堆

比较堆的首元素的大小和要插入数字的大小

如果说插入的数字大于首元素 那么就替换首元素 之后向下调整

这样子到最后在这个堆里面留下的肯定是最大的K个数

大家仔细想想看是不是

(因为最大的数肯定会沉到最下面)

我们来简单实现一下这个算法的逻辑

我们首先先创建一个小堆

然后插入10000个数据

之后开始逐个比较堆顶元素和需要插入的元素的大小

如果说堆顶元素小于我们需要插入的元素

那么删除堆顶元素 之后插入我们的元素

大体思路就是这样子

我们用文件的方法来完成一下

1.建堆 -- 从a中前k个元素建小堆

1.1读出前k个数据建小堆

2.将剩余的n-k个元素依次与堆顶元素交换,不满足则替换

代码如下:

void PrintTopK(const char* file, int k)
{
	//1.建堆 -- 从a中前k个元素建小堆
	int* topk = (int*)malloc(sizeof(int) * k);
	assert(topk);

	FILE* fout = fopen(file, "r");
	if (fout == NULL)
	{
		perror("fopen error");
		return;
	}

	//读出前k个数据建小堆
	for (int i = 0; i < k; ++i)
	{
		fscanf(fout, "%d", &topk[i]);
	}
	for (int i = (k - 2) / 2; i >= 0; --i)
	{
		AdJustDown(topk, k, i);
	}
	//2.将剩余的n-k个元素依次与堆顶元素交换,不满足则替换
	int val = 0;
	//读出剩余的n-k个数据
	int ret = fscanf(fout, "%d", &val);
	while (ret != EOF)
	{
		if (val > topk[0])
		{
			topk[0] = val;
			AdJustDown(topk, k, 0);
		}
		ret = fscanf(fout, "%d", &val);
	}
	//打印出前k个元素
	for (int i = 0; i < k; i++)
	{
		printf("%d ", topk[i]);
	}
	printf("\n");
	free(topk);
	fclose(fout);
}

 我们用示例来演示一下

造数据

代码如下

void CreateDate()
{
	//造数据
	int n = 10000;
	srand(time(0));
	const char* file = "data.txt";
	FILE* fin = fopen(file, "w");
	if (fin == NULL)
	{
		perror("fopen fail");
		return;
	}
	for (int i = 0; i < n; i++)
	{
		int x = rand() % 10000;
		fprintf(fin, "%d\n", x);
	}
	fclose(fin);

}

现在实现的话要分成两步:

1.造数据

2.就用我们的PrintTopK函数

主函数这样写:

1.

int main()
{
	CreateDate();
	//PrintTopK("data.txt", 10);
	return 0;
}

2.

int main()
{
	//CreateDate();
	PrintTopK("data.txt", 10);
	return 0;
}

那我们怎么知道取出来的数据是最大的呢?

 这时候我们可以看这步

int x = rand() % 10000;

 我们可以设计10个大于10000的值,就可以知道程序是否正确

看下是否成小堆

 

是小堆

完美实现

以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言

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

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

相关文章

昇思25天学习打卡营第11天|基于MindSpore通过GPT实现情感分类

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 基于MindSpore通过GPT实现情感分类 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninsta…

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(4)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督继续为大家带来系列——小学生都能玩的语音模块&#xff0c;帮你一周内快速学会语音模块的使用方式&#xff0c;打造一个可用于智能家居、物联网领域的语音助…

01 Docker 概述

目录 1.Docker简介 2.传统虚拟机 vs 容器 3.Docker运行速度快的原因 4.Docker基本组成三要素 5.Docker 平台架构 入门版 架构版 1.Docker简介 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere&#xff0c…

抖音常用的视频剪辑软件有哪些,变速视频如何制作?

抖音是一款当下流行的短视频软件。很多人都想在上面发表自己的作品&#xff0c;但是也还有人因为不会剪辑&#xff0c;找不到合适的视频制作软件&#xff0c;一直没能行动。今天就为大家解答抖音常用的制作视频软件有哪些&#xff0c;如何调整抖音制作视频的速度。 希望大家看完…

AzureDataFactory 实体间的关联如何处理(Lookup)

使用ADF从外部数据源(例如Sql Server)往D365推数时&#xff0c;实体间的Lookup一定是要做的&#xff0c;本篇以我项目中的设备为例&#xff0c;设备表中有产品的lookup字段 设备表结构如下 msdyn_customerasset 表名ID 设备表guidSerialNumber设备序列号ProductCode设备对应的…

Hadoop3:NameNode和DataNode多目录配置(扩充磁盘的技术支持)

一、NameNode多目录 1、说明 NameNode多目录&#xff0c;需要在刚搭建Hadoop集群的时候&#xff0c;就配置好 因为&#xff0c;配置这个&#xff0c;需要格式化NameNode 所以&#xff0c;如果一开始没配置NameNode多目录&#xff0c;后面&#xff0c;就不要配置了。 2、配置…

Linux环境下的字节对齐现象

在Linux环境下&#xff0c;字节对齐是指数据在内存中的存储方式。字节对齐是为了提高内存访问的效率和性能。 在Linux中&#xff0c;默认情况下&#xff0c;结构体和数组的成员会进行字节对齐。具体的对齐方式可以通过编译器选项来控制。 在使用C语言编写程序时&#xff0c;可…

技术市集 | 如何通过WSL 2在Windows上挂载Linux磁盘?

你是否常常苦恼&#xff0c;为了传输或者共享不同系统的文件需要频繁地在 Windows 和 Linux 系统之间切换&#xff0c;既耽误工作效率&#xff0c;也容易出错。 那么有没有一种办法&#xff0c;能够让你在Windows系统中像访问本地硬盘一样来操作Linux系统中的文件呢&#xff1…

jni原理和实现

一、jni原理 主要就是通过数据类型签名和反射来实现java与c/c方法进行交互的 数据类型签名对应表 javac/cbooleanZbyteBcharCshortSintIlongLfloatFdoubleDvoidVobjectL开头&#xff0c;然后以/分割包的完整类型&#xff0c;后面再加; 比如String的签名就是Ljava/long/Strin…

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(一)一些样式的调整使用

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、比如下面的发起人双击后出现的界面不正常&#xff0c; 看它的样式主要是这个里面的margin-left应该太小了&#xff0c; [data-v-45b533d5] .el-tabs__content { margin-top: 50px;mar…

实用麦克风话筒音频放大器电路设计和电路图

设计目标 输入电压最大值输出电压最大值电源Vcc电源Vee频率响应偏差20Hz频率响应偏差20kHz100dB SPL(2Pa)1.228Vrms5V0V–0.5dB–0.1dB 设计说明 此电路使用跨阻抗放大器配置中的运算放大器将驻极体炭精盒麦克风的输出电流转换为输出电压。此电路的共模电压是固定的&#xf…

第15届蓝桥杯Python青少组选拔赛(STEMA)2023年8月真题-附答案

第15届蓝桥杯Python青少组选拔赛&#xff08;STEMA&#xff09;2023年8月真题 题目总数&#xff1a; 11 总分数&#xff1a; 400 一、单选题 第 1 题 单选题 以下不符合 Python 语言变量命名规则的是&#xff08; &#xff09;。 A. k B. 2_k C. _k D. ok 答案 B …

cesium方案论证实现功能

仓库地址&#xff1a;Harvey-Andrew 演示地址&#xff1a;哔哩哔哩-满分观察网友z 文章目录 1. 场景加载2. 3D 模型2.1. 坐标转换2.2. 放置模型2.3. 调整模型2.4. 提交方案 3. 查看方案3.1. 场景还原3.2. 删除 1. 场景加载 加载Cesium的Melbourne Photogrammetry的倾斜摄影作…

【Threejs进阶教程-着色器篇】1. Shader入门(ShadertoyShader和ThreejsShader入门)

ThreejsShader入门 关于本Shader教程认识ShaderShader和Threejs的关系WebGLShaderThreejsShaderShadertoyShader其他Shader 再次劝退数学不好的人从ShaderToy开始Shader的代码是强类型glsl的类型&#xff0c;变量&#xff0c;内置函数&#xff0c;关键字关于uv基于UV的颜色处理…

Linux——高级IO

目录 IO 五种IO模型 阻塞式IO 非阻塞式IO 信号驱动IO 多路转接 异步IO 阻塞IO VS 非阻塞IO IO 网络的知识我们已经介绍完了&#xff0c;网络通信的本质就是IO&#xff0c;一方要发送数据&#xff0c;还要接收数据&#xff0c;这就是一次IO&#xff0c;所以我们原来说过…

解决VSCode中导入PyTorch时报错的HTTP错误与Channel冲突

问题描述与解释 在Anaconda中成功安装PyTorch&#xff0c;并进行了验证&#xff1a; (base) C:\Users\Hui>conda activate pytorch(pytorch) C:\Users\\Hui>python Python 3.8.19 (default, Mar 20 2024, 19:55:45) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on …

安装windows服务,细节

1、选中服务代码&#xff0c;右键添加安装程序。 2、安装程序的权限一定改为local,否则安装时会提示null错误。 3、安装服务 InstallUtil D:\vs2022work\testFW\testFW\bin\Debug\testFW.exe p:InstallUtil 需要新建环境变量才能直接使用&#xff08;找到InstallUtil 工具所在…

沃尔核材:价值重估

当英伟达这个曾经的GPU行业龙头&#xff0c;伴随AI的发展成为AI芯片架构的供应商时&#xff0c;他就跳出了原本行业的竞争格局&#xff0c;曾经还能与之一战的超威半导体被远远甩在身后&#xff0c;成为宇宙第一公司。 这说的就是一家公司价值的重估。今天给大家聊的也是这样一…

【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类

类的设计目标是为了实现 RGB 相机与 ToF 深度传感器之间的高精度校准&#xff0c;从而使两种类型的数据能够在同一个坐标框架内被整合使用。这在很多场景下都是非常有用的&#xff0c;比如在3D重建、增强现实、机器人导航等应用中&#xff0c;能够提供更丰富的场景信息。 -----…

学习笔记(linux高级编程)11

进程间通信 》信号通信 应用&#xff1a;异步通信。 中断&#xff0c;&#xff0c; 1~64&#xff1b;32应用编程。 如何响应&#xff1a; Term Default action is to terminate the process. Ign Default action is to ignore the signal. wait Core Default action is …