【数据结构】TOP-K问题/使用堆解决

news2025/5/24 19:58:15

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • TOP-K问题
    • 一、题目描述
    • 二、 思路:
    • 三、代码实现
      • 1.随机产生一万个数据,存入文件中。
      • 2.找前K个最大值
      • 3.测试类:
    • 四、时间复杂度和空间复杂度分析

TOP-K问题

一、题目描述

假设有一亿个数据,内存存储不下,而我们只需要这一亿个数据中最大的前K个。

二、 思路:

1.:存前K个数据入堆
从第二个开始,每存储一个数据进来,就对其进行向上调整,使其一直保持为小堆。直到k-1个节点停止存储。
2.再从第K+1个数据开始读取
此时读取的数据就不再往堆中插入了,而是与堆顶元素进行比较,如果比堆顶大,那么就替换堆顶元素,然后进行基于小堆的向下调整。
3.所有数据读取完毕,堆中剩余的K个就是最大的K个数据

三、代码实现

1.随机产生一万个数据,存入文件中。

void CreateNDate()
{
	// 造数据
	int n = 10000000;
	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) % 10000000;
		fprintf(fin, "%d\n", x);
	}

	fclose(fin);
}

2.找前K个最大值

void PrintTopK(const char* filename, int k)
{
 建堆/用a中前k个元素建堆
	FILE* fout = fopen(filename, "r");
	if (fout == NULL)
	{
		perror("fopen fail");
		return;
	}
开辟K个元素空间
	int* minheap = (int*)malloc(sizeof(int) * k);
	if (minheap == NULL)
	{
		perror("malloc fail");
		return;
	}
将前k个元素读入数组minheap
	for (int i = 0; i < k; i++)
	{
		fscanf(fout, "%d", &minheap[i]);
	}
 用前k个数建小堆,使用从下到上的向下调整方法建堆。
k-1下标的双亲节点是(k-1-1/2for (int i = (k - 2) / 2; i >= 0; --i)
	{
		AdjustDown(minheap, k, i);
	}


将剩余n-k个元素依次与堆顶元素交换,不满足,则替换
	int x = 0;
	while (fscanf(fout, "%d", &x) != EOF)
	{
		if (x > minheap[0])
		{
替换堆顶元素进堆
			minheap[0] = x;
并且进行调整
			AdjustDown(minheap, k, 0);
		}
	}

遍历完所有n个数据后,打印出堆中的数据,就是最大的K个数据啦!
	for (int i = 0; i < k; i++)
	{
		printf("%d ", minheap[i]);
	}
	printf("\n");

	fclose(fout);
}

// fprintf  fscanf



3.测试类:

int main()
{
	//CreateNDate();
	PrintTopK("data.txt", 5);

	return 0;
}

四、时间复杂度和空间复杂度分析

🔸时间复杂度:O(N*logK);
N:节点个数。K:最大的前K个个数
如果N>>K,那么可以认为时间复杂度是O(N);这也是此算法的厉害之处。
🔸空间复杂度:O(K);
K:最大的前K个个数.

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

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

相关文章

第70步 时间序列建模实战:ARIMA建模(JMP)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用JMP进行SARIMA模型的构建。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with …

flutter简单的本地草稿箱功能

需求1&#xff1a;发帖退出时提示是否保存草稿 需求2&#xff1a;每条草稿中可以保存多张图片(最多9张)或一条视频及三十来个其它参数 需求3&#xff1a;每条草稿都是可以被覆盖的、可以点击删除 需求4&#xff1a;草稿页面可以一键清空 需求5&#xff1a;草稿随app删除一起没掉…

简单2D几何求交点

2D图形SVG工具添加了通过选项属性显示交点的功能。 PaladinDu&#xff1a;2D图形SVG化工具0 赞同 0 评论文章 在这个工具中&#xff0c;已经定义的数据结构有点&#xff0c;线段&#xff0c;有向线段&#xff0c;射线&#xff0c;直线&#xff0c;多边形&#xff0c;和圆。 …

【技巧】如何保护PDF文件不被随意修改?

做好的PDF文件&#xff0c;不想被他人随意修改&#xff0c;只要给PDF设置“限制保护”就可以了&#xff0c;设置保护后需要输入密码才能进行编辑。 设置“限制保护”我们需要用到PDF编辑器&#xff0c;以小编使用的编辑器为例&#xff0c;首先通过编辑器打开PDF文件后&#xf…

医学访问学者申请四点规划建议

医学领域一直以来都是人类社会的重要组成部分&#xff0c;而作为一名有志于成为一名医学领域的访问学者&#xff0c;您需要明确自己的目标并做好充分准备。知识人网小编将为您提供四点规划建议&#xff0c;以帮助您成功申请医学访问学者的机会。 第一点&#xff1a;明确研究方向…

input 的 placeholder 样式

::placeholder 伪元素 这个伪元素可以改变 input、textarea 占位文本的样式。 input::placeholder {color: green; }完整的兼容性写法&#xff1a; input {&::-webkit-input-placeholder, /* WebKit browsers*/ &:-moz-input-placeholder, /* Mozilla Firefox 4 to …

2个小时的腾讯面试经历(C++),来看看它终究考察了些什么?

今天分享一位同学实习面试鹅厂 c 岗的面试&#xff0c;全程都是问 C 和计算机基础&#xff08;系统、网络、算法&#xff09;的内容了。难度中规中矩吧&#xff0c;基本都是追问式的问法&#xff0c;一层一层往下问。 C相关 对面向对象的理解 C面向对象编程就是把一切事物都…

Kubernetes 部署应用(nginx)的两种方式,你更喜欢哪一种?

k8s发布应用的两种方式&#xff1a; kubernetes-dashboardkubectl命令行 一、Dashboard方式 配置部署&#xff1a;包含应用名称、容器镒、pod数量、Service非常的方便&#xff0c;不想设置配置yaml的可以很方便的部署。 点击部署就成功了k8s应用的部署了。部署后可以看到相应…

python爬虫经典案例(一)

爬虫&#xff08;Web Scraping&#xff09;是一种自动获取互联网信息的技术&#xff0c;广泛用于数据采集、分析和应用开发。无论你是数据科学家、市场营销专家还是应用程序开发者&#xff0c;都可以通过编写爬虫来获取所需的信息。在本文中&#xff0c;我们将介绍五个实用的爬…

从0开始实现简易版vue2

文章目录 前言原理思路分析实现Observer实现Watcher实现Compile 前言 Vue.js的双向绑定原理是其最重要的特性之一&#xff0c;它使得数据模型和DOM之间的同步变得非常简单和高效。 先上个成果图来吸引各位&#xff1a; new SimpleVue({el: #app,data: {title: SimpleVue,name…

re学习(37)DASCTF 2023_7 controlflow

IDA载入一下 发现flag的长度为40&#xff0c;然后将input[i]的值赋值给str[i]&#xff0c;str[i]又执行一个异或操作&#xff0c;但是上面又有一些函数&#xff0c;导致这个程序的控制流有点奇怪..... 输入40只&#xff0c;检验是否是flag。 F5直接罢工了&#xff0c;暂时先忽…

Java入坑之代理

一、代理模式和静态代理 1.1代理模式 代理模式 - Proxy Pattern, 23个经典模式的一种&#xff0c;又称委托模式 -为目标对象提供(包装)了一个代理&#xff0c;这个代理可以控制对目标对象的访问 外界不用直接访问目标对象&#xff0c;而是访问代理对象&#xff0c;由代理对象再…

软件外包开发bug管理工具

国内有一些常用的Bug管理工具&#xff0c;这些工具旨在帮助团队有效地发现、跟踪和解决软件开发中的缺陷和问题。以下是一些国内的Bug管理工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.禅道&…

在openSUSE上开启护眼模式

色温 色温是用来衡量光源色彩时所用到的一个概念&#xff0c;单位为开尔文。热黑体辐射体与光源温度相同时的温度&#xff0c;就是该光源的色温。 显而易见&#xff0c;色温越低时&#xff0c;光源看起来越黄&#xff1b;色温越高时&#xff0c;光源看起来越蓝。下面是一些常见…

【LangChain系列 9】Prompt模版——MessagePromptTemplate

原文地址&#xff1a;【LangChain系列 9】Prompt模版——MessagePromptTemplate 本文速读&#xff1a; MessagePromptTemplate MessagesPlaceholder 在对话模型(chat model) 中&#xff0c; prompt主要是封装在Message中&#xff0c;LangChain提供了一些MessagePromptTemplat…

入门必读:Python try except异常处理详解

Python 中&#xff0c;用try except语句块捕获并处理异常&#xff0c;其基本语法结构如下所示&#xff1a; try: 可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]: 处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]: 处理异常的代码块…

CSAPP Bomb Lab

CSAPP Bomb Lab 芜湖&#xff0c;完成实验来记录一下啦~ 这个lab看的我真是眼皮发麻&#xff0c;框框就是反汇编->c语言形式->优化c语言 最后我才能写出来&#xff0c;整的我睡觉都是 mov… lea… 难道适中&#xff0c;感觉只要耐心一点就没问题&#xff0c;好了现在开…

【鸿蒙(HarmonyOS)】List列表、ArkUI资源组数据类型

一、引言 描述&#xff1a;List列表在移动端设备中最为常见。比如&#xff1a;通讯录、短信、聊天软件等都&#xff0c;都拥有他的身影。难度&#xff1a;简单知识点&#xff1a;1、列表组件的使用2、认识ArkUI资源组数据类型 二、列表List 1、发现问题&#xff08;Bug&…

2023-9-14 石子合并

题目链接&#xff1a;石子合并 #include <iostream> #include <algorithm>using namespace std;const int N 310, INF 1e9;int n; // 前缀和 int s[N]; int f[N][N];int main() {cin >> n;for(int i 1; i < n; i ) cin >> s[i];for(int i 1; i …

模式分类与“组件协作模式”

1. GOF-23 模式分类 从目的来看&#xff1a; 创建型&#xff08;Creational&#xff09;模式&#xff1a;将对象的部分创建工作延迟到子类或者其他对象&#xff0c;从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型&#xff08;Structural&#xff09;模式&#…