【C语言】Top K问题【建小堆】

news2025/1/21 18:40:49

前言

TopK问题:从n个数中,找出最大(或最小)的前k个数。

在我们生活中,经常会遇到TopK问题

比如外卖的必吃榜;成单的前K名;各种数据的最值筛选

问题分析

显然想开出40G的空间是不现实的,那应该怎么办呢?

答案是:建小堆

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

// 造数据
void CreateNDate()
{
	// 造数据
	int n = 10000;
	srand(time(0));
	const char* file = "data.txt";
	FILE* fin = fopen(file, "w");
	if (fin == NULL)
	{
		perror("fopen error");
		return;
	}

	for (int i = 0; i < n; ++i)
	{
		int x = (rand() + i) % 1000000;
		fprintf(fin, "%d\n", x);
	}

	fclose(fin);
}
void Swap(int* px, int* py)
{
	int tmp = *px;
	*px = *py;
	*py = tmp;
}
//向下调整算法
void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] < a[child])
		{
			child++;
		}
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
void PrintTopK(int k)
{
	FILE* fout = fopen("data.txt", "r");
	if (fout == NULL)
	{
		perror("fopen mail");
		return;
	}
	int* minheap = (int*)malloc(sizeof(int) * k);
	if (minheap == NULL)
	{
		perror("minheap mail");
		return;
	}
	for (int i = 0; i < k; i++)
	{
		fscanf_s(fout, "%d", &minheap[i]);
		
	}
	//建小堆
	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(minheap, k, i);
	}
	int x = 0;
	int val = 0;
	while (val = fscanf_s(fout, "%d", &x) != EOF)
	{
		if (x > minheap[0])
		{
			minheap[0] = x;
			AdjustDown(minheap, k, 0);
		}
	}
	for (int i = 0; i < k; i++)
	{
		printf("%d ", minheap[i]);
	}

	fclose(fout);
}
int main()
{
	//CreateNDate();
	printf("请输入k:>");
	int k = 0;
	scanf_s("%d", &k);
	PrintTopK(k);

	return 0;
}

运行结果:

结果验证

那我们怎么确定输出在屏幕上的数据就是最大的数据呢?

我们可以在已经创建的数据上面修改,如图后面111的是在原有数据上手动添加的

重新运行,结果与预期一致

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

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

相关文章

【目标检测实验系列】YOLOv5高效涨点:基于NAMAttention规范化注意力模块,调整权重因子关注有效特征(文内附源码)

1. 文章主要内容 本篇博客主要涉及规范化注意力机制&#xff0c;融合到YOLOv5(v6.1版本&#xff0c;去掉了Focus模块)模型中&#xff0c;通过惩罚机制&#xff0c;调整特征权重因子&#xff0c;使模型更加关注有效特征&#xff0c;助力模型涨点。 2. 简要概括 论文地址&#x…

2024-08-04 C# 中 string 实用技巧级新手常见错误

文章目录 1 方法重载1.1 string.Split()1.2 string.Indexof() 2 方法对比2.1 Contains2.2 Equals2.3 字符串差值 3 StringBuilder4 换行符4.1 推荐做法4.2 换行符混合问题 5 文件路径分隔5.1 推荐做法 6 测试代码6.1 "OnlySplit()" vs "SplitWithTrim()"6.…

三十种未授权访问漏洞复现 合集( 二 )

未授权访问漏洞介绍 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷&#xff0c;导致其他用户可以直接访问&#xff0c;从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。---->目录遍历 目前主要存在未授权访问漏洞的有:NFS服务&a…

杂粮饼:健康与美味的完美融合

在美食的世界里&#xff0c;杂粮饼以其独特的魅力吸引着众多食客。这种看似平凡的美食&#xff0c;却蕴含着丰富的营养和令人陶醉的口感。杂粮饼&#xff0c; 顾名思义&#xff0c;是由多种杂粮混合制作而成。常见的杂粮如玉米、小米、高粱、燕麦等&#xff0c;它们各自带着独特…

Ability框架介绍

Ability Ability是应用所具备能力的抽象&#xff0c;也是应用程序的基本组成部分&#xff0c;主要包括组件生命周期回调、系统环境变化通知、应用跳转、卡片开发等能力。 Ability框架模型两种形态 FA模型Stage模型 Stage模型 Stage模型中的应用组件是由Ability这个基础概念…

LLM动手实践(一): 微调google的bert和vit模型完成文本和图片的分类任务

1. 写在前面 最近大模型比较火热&#xff0c;也正好在公司开始接触这块相关的业务&#xff0c;大模型是未来的趋势&#xff0c;对于研发工程师来讲&#xff0c;是powerful的效能工具&#xff0c;所以想沉淀一些大模型实践相关的笔记来记录自己在使用大模型产品&#xff0c;部署…

基于的X86+FPGA轨道交通模块化计算机,标准3U无风扇,支持国产化定制

支持Intel Socket G2 Mobile Sandy/Ivy Bridge i7/i5/i3处理器,Intel QM67/QM77,2*LAN,2*USB2.0,2*USB3.0,3*COM,3U ◆ 支持Intel Socket G2 Mobile Sandy/Ivy Bridge i7/i5/i3处理器,Intel QM67/QM77 ◆ 1*DDR3 SO-DIMM内存 ◆ 1*VGA,1*HDMI ◆ 2*LAN,2*USB2.0,2*USB3.0,3*…

Opencv学习-图像连接(vconcat函数和hconcat函数)

1. vconcat函数介绍&#xff08;竖向连接&#xff09; void cv::vconcat(const Mat * src, size_t nsrc, OutputArray dst ) src&#xff1a;Mat矩阵类型的数组。 nsrc&#xff1a;数组中 Mat 类型数据的个数。 dst&#xff1a;连接后的 Mat类矩阵。 该函数对存放在数组矩阵中…

gpt-4.o mini

https://share.xuzhugpt.cloud/ gpt-4.o mini 目前免费使用 把上面[chatgpt4o-mini-xuzhu]复制到UserToken的文本框中 点击[个人账户] 测试一下哈&#xff0c;看看&#xff1a;

2435. 矩阵中和能被 K 整除的路径(leetcode)

文章目录 写在前面题目来源思路code 写在前面 看题解看了半天都看不懂&#xff0c;看了视频也看了好久&#xff0c;最后还是自己手动模拟才懂的&#xff0c;大佬们写的代码非常好&#xff0c;自己根本想不到该如何用代码实现出来&#xff0c;还是得多刷题&#xff0c;多见一些…

【5G NAS】全球唯一临时标识符GUTI介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

计算机毕业设计选题推荐-体育商城-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

通过Stack Overflow线程栈溢出的问题实例,详解C++程序线程栈溢出的诸多细节

目录 1、问题说明 2、从Visual Studio输出窗口中找到了线索&#xff0c;发生了Stack Overflow线程栈溢出的异常 3、发生Stack Overflow线程栈溢出的原因分析 4、线程占用的栈空间大小说明 5、引发线程栈溢出的常见原因和场景总结 6、在问题函数入口处添加return语句&…

How dose age change how you leanr?(1)年龄如何影响学习能力?(一)

As you get older, learning often feels harder than it used to.Why is that?What changes in the brain as we age that makes acquire new information harder? Is there anything we can do to avoid our minds slowing down? 随着年龄增长&#xff0c;常常会觉得学习…

Vue+live2d实现虚拟人物互动(一次体验叙述)

目录 故事的开头&#xff1a; 最终的实现效果&#xff1a; 实现步骤&#xff1a; 第一步&#xff1a;下载重要文件 第二步&#xff1a;创建vue项目文件&#xff0c;将刚下载文件拷贝到public目录下 第三步&#xff1a;在index.html文件中引入js 第四步&#xff1a;使用&…

SAM 2:Segment Anything in Images and Videos 论文详解

SAM 2:Segment Anything in Images and Videos 文章目录 SAM 2:Segment Anything in Images and Videos摘要1 Introduction具体分析: 2 Related work具体分析&#xff1a; 3 任务&#xff1a;可提示的视觉分割4 模型具体分析&#xff1a; 5 数据5.1 Data engine5 . 2 SA - V数据…

c++ 初始值设定项列表(initializer_list)

引例 我们在写c代码的时候&#xff0c;多多少少会遇到这样写的&#xff1a; 如果是这样写还好说&#xff1a; 第一个是因为编译器强制匹配参数。 其他都是因为在有对应构造函数的情况下支持的隐式类型转换。 而支持的构造函数是这个&#xff1a; 如果有不懂的可以开这一篇&a…

致远互联FE协作办公平台apprvaddNew接口SQL注入漏洞复现 [附POC]

文章目录 致远互联FE协作办公平台apprvaddNew接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现致远互联FE协作办公平台apprvaddNew接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内…

BGP对等体组、聚合、路由反射器、联盟、团体属性

一.实验拓扑 二.实验需求 1.AS1中存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告 As3中存在两个环回&#xff0c;一个地址为192.168.2.0/24,、该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以ping通; 2.整个AS2的I…

【数据结构】栈和队列(c语言实现)(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 一、栈 1.栈的概念与结构 2.栈的实现 2.1 栈的结构定义 2.2 方法的声明 2.3 方法的实现 2.3.1 初始化 2.3.2 销毁 2.3.3 判空 2.3.4 压…