数据结构——堆的应用 Topk问题

这篇具有很好参考价值的文章主要介绍了数据结构——堆的应用 Topk问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
数据结构——堆的应用 Topk问题,数据结构,每日一函数,数据结构,c语言,排序算法,算法

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:数据结构学习笔记 、C语言系列函数实现
💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信我哦~

🥳🥳前面我们学习了利用堆进行排序,今天我们将继续介绍利用堆解决前k个最值的问题,Topk问题(在N个数中找出最大的前k个)在实际生活中也非常常见,💥💥比如店外卖时评分最高的前十家店铺,玩王者时英雄战力前十名等与排序排名有关的应用。

🥰🥰解题思路

正常思路 将这N个数建成一个大堆,然后Popk次,就可以找出最大的前k个 ;
💫💫但是如果N非常大以亿计(10亿个整数所占空间大概4G)那么就会非常耗时耗力,难以计算。

这里给出一种更好的解决办法:

①将前k个数建成小堆;(必须是小堆哦~)
②后面N-k个数依次比较,如果比堆顶的数据大,就替换它进堆
③然后将替换后的再向下调整使之重新成为一个小堆;
④最后这个小堆的值就是最大的前k个。

在写题之前我们先要创造N个数,可以通过c语言的文件操作以及随机生成函数来获得并写入文件中:

代码如下:

#include<time.h>
//创造N个数据
void CreatData()
{
	//造数据
	int n = 1000;
	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() % 10000;
		fprintf(fin, "%d\n", x);
		
	}
	fclose(fin);
}

✨✨这里使用了srand生成随机数需要包含time.h头文件;
int x = rand() % 10000;这个式子可以帮助我们生成10000以内的随机数;
fprintf可以帮助我们将生成的随机数写入到文件中(如下图生成了data文件):

数据结构——堆的应用 Topk问题,数据结构,每日一函数,数据结构,c语言,排序算法,算法

所以生成文件后为了找到最大的前k个,我们可以手动改一些数据来验证后续代码的正确性:

数据结构——堆的应用 Topk问题,数据结构,每日一函数,数据结构,c语言,排序算法,算法

这里手动改了5个,后面如果找出这五个最大的数就说明我们写的代码是正确的啦~🥳🥳
为了保证文件数据不被覆盖,我们在运行一次CreatData()函数之后就可以把它屏蔽掉了,此时已经生成了n个数据的文件data.txt了。


int main()
{
	
	//CreatData();//屏蔽
	PrintTopk(5, 1000);

	return 0;
}

Topk排序

造完数据后我们就可以利用之前学习过的堆来求出Topk啦

代码如下:

void PrintTopk(int k,int n)
{
	//打开文件
	const char* file = "data.txt";
	FILE* fout = fopen(file, "r");
	if (fout == NULL)
	{
		perror("fopen error");
		return;
	}
	//创建顺序表开辟空间
	int* kminheap = (int*)malloc(sizeof(int) * k);
	if (kminheap == NULL)
	{
		perror("malloc fail");
		return;
	}
	//从文件中读取k个数
	for (int i = 0; i < k; i++)
	{
		fscanf(fout, "%d", &kminheap[i]);
	}
	//将读取的k个数创建为小堆
	//堆向下调整算法
	for (int i = (k - 2) / 2; i >= 0; i--)
	{
		AdjustDown(kminheap, k, i);
	}
	//将剩余N-k个数依次与堆顶元素比较
	for (int i = 0; i < n - k; i++)
	{
		int tmp = 0;
		fscanf(fout, "%d", &tmp);
		if (tmp > kminheap[0])
		{
			Swap(&tmp, &kminheap[0]);
			AdjustDown(kminheap, k, 0);
		}
	}
	//打印前k个元素
	for (int i = 0; i < k; i++)
	{
		printf("%d\n", kminheap[i]);
	}
}

对于造小堆以及排序有疑问的可以看看土土的上篇博客🥰🥰——堆排序详解

运行代码如下:

int main()
{
	
	//CreatData();
	PrintTopk(5, 1000);

	return 0;
}

运行结果如下:
数据结构——堆的应用 Topk问题,数据结构,每日一函数,数据结构,c语言,排序算法,算法

🎉🎉完全正确~是我们之前改的那五个数,说明我们的代码将它从1000个数中找了出来🥳🥳至此Topk问题得到解决 ~

✨✨这里再提一句,打印出来的虽然是n个数中的最大的k个但是我们发现打印的顺序是乱的,通过之前排序的学习,大家知道怎么将他们按顺序打印出来吗?有兴趣的小伙伴可以尝试一下~🥳🥳

结语

以上就是数据结构中利用堆排序求解Topk问题啦,关键在于对于堆排序的理解与运用~有疑问的小伙伴可以将问题打在评论区或者私信我哦 ~完结撒花 ~🥳🥳🎉🎉🎉文章来源地址https://www.toymoban.com/news/detail-839937.html

到了这里,关于数据结构——堆的应用 Topk问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构---手撕图解堆的实现和TopK的应用

    要讲到堆,先要说两个关于二叉树的概念 满二叉树:一个二叉树如果每一层的节点数都是最大值,那么这个二叉树就是满二叉树 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是满二叉树的变形,对于深度为k的树有n个节点的二叉树,当且仅当其每一个节点都与

    2024年02月16日
    浏览(30)
  • 数据结构学习分享之堆的详解以及TopK问题

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:数据结构学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你了解更多数据结构的知识   🔝🔝 本章就给大家带来久违的堆的知识,如果你还不知道数的相关知识,或者什么是完全二叉树,请跳转 树的介绍, 本章的堆结

    2024年02月05日
    浏览(71)
  • 【数据结构】长篇详解堆,堆的向上/向下调整算法,堆排序及TopK问题

    堆就是将一组数据所有元素按完全二叉树的顺序存储方式存储在一个 一维数组 中,并满足树中 每一个父亲节点都要大于其子节点 称为 大堆 (树中 每一个父亲节点都要大于其子节点 称为 小堆 )。 性质 ①对于大堆(大根堆)来说,堆的顶部也就是数组首元素一定是最大的元素 ②

    2024年02月07日
    浏览(31)
  • 经典TopK问题、优先级队列 与 堆的纠葛一文为你解惑——数据结构

    前言: 本篇文章以 TopK 问题为引,具体阐述了 PriorityQueue 实现的基本逻辑——堆 数据结构,以及PriorityQueue 的常用方法。如有问题欢迎看官朋友指正,如果觉得文章还不错的话,求点赞、收藏、评论 三连。 重点: 堆的基本实现逻辑 PriorityQueue 运用和源码分析 TopK 问题的解法

    2023年04月22日
    浏览(34)
  • 【数据结构之二叉树简介·顺序存储·应用:堆·堆排序·TOPK问题】

    ​ 🕺作者: 迷茫的启明星 😘欢迎关注:👍点赞🙌收藏✍️留言 🎃相关文章 【数据结构从0到1之树的初识】 【数据结构】带你学会二叉树的链式存储的前中后序遍历,遍历推导及利用队列实现二叉树的层次遍历。 🏇家人们,码字不易,你的👍点赞🙌收藏❤️关注对我

    2024年02月01日
    浏览(27)
  • 【数据结构】堆的应用+TOP-K问题+二叉树遍历

    欢迎来到我的: 世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 该篇文章写到主要是:堆排序、 TOP-K问题、二叉树链式结构的实现、二叉树的遍历等等;如果有朋友还不太了解堆以及二叉树可以翻看我的上一篇博客:堆和二叉树的概念; 最

    2024年02月07日
    浏览(43)
  • 数据结构-堆的实现及应用(堆排序和TOP-K问题)

    1.堆的知识点: 下面我们通过一张图片来更加深刻地理解堆 上面我们说过,堆的物理结构是一个数组,逻辑结构是一个完全二叉树,所以堆的实际结构类似于顺序表,只不过我们的处理方式类似于二叉树 那么我们就可以用顺序表那样的结构来表示堆了 于是我们可以写出这样的代码

    2024年02月07日
    浏览(41)
  • 数据结构进阶篇 之 【堆的应用】(堆排序,TOP-K问题)详细讲解

    所有人都关心我飞的高不高,只有我妈关心我翅膀硬不硬 1.1 建堆 1.2 利用堆删除思想来进行排序 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀– 学习一个知识,我们起码要直

    2024年04月10日
    浏览(37)
  • Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍      文章目录         1.0 堆的说明         2.0 堆的成员变量及其构造方法          3.0 实现堆的核心方法         3.1 实现堆的核心方法 - 获取堆顶元素 peek()         3.2 实现堆的核心方法 - 下潜 do

    2024年02月04日
    浏览(40)
  • 堆的实际应用(topk问题以及堆排序)

    目录 前言: 一:解决topk问题 二:堆排序 【1】第一种方法(很少用) 【2】第二种方法(很实用) 上一次我们进行了二叉树的初步介绍并实现了堆的基本功能,但堆的作用并不是存储数据, 它可以用来解决topk问题 ( 求一组数据较大或者较小的前k个 )以及 对数据进行排序 。 附上一

    2024年02月01日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包