【追梦之旅】— 堆的实际应用--TopK问题

news2025/1/12 21:06:32

【追梦之旅】— 堆的实际应用--TopK问题😎

  • 前言🙌
    • 堆的TopK问题的现实栗子
    • 堆的TopK思路的应用场景
    • 堆的TopK思路的具体实现
      • fscanf函数
      • fprintf函数
      • 堆的TopK具体实现代码:
      • 前K个数据的巧妙设置
      • 运行结果截图:
  • 总结撒花💞

追梦之旅,你我同行

   
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
在这里插入图片描述

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,介绍有关堆的实际应用–TopK问题~ 都是精华内容,可不要错过哟!!!😍😍😍

堆的TopK问题的现实栗子

堆是一种在日常开发中,经常被使用到的一种数据结构,也可以说和我们的生活息息相关。例如,我们点外卖时,美团这些外卖软件并不会将所有的店家都展示在页面上,它会有推荐店家页面,我们只能在页面直接上看到这些推荐的店家。而这一功能的实现就是因为其底层的代码应用了堆TopK的思想 + 排序。还有就是我们玩游戏的时候,也有战力榜、富豪榜、等等,这些功能的设计代码都应用到了堆的知识。

堆的TopK思路的应用场景

TopK的应用场景:简单来说,TopK的应用场景是用于大数据量前提下,选出前K个数据的业务场景。像一些比较大型的软件上,实现推荐功能或者一些大型软件上的Top排行榜等等。

堆的TopK思路的具体实现

我们这里设计是实现在文件上的数据进行Top思路的实现。为什么直接在内存上进行呢,这样编写不是更简单吗?其实这是有其原因存在的。因为我们的TopK的应用场景是大数据量的情况下,选出前k个数据的。我们知道,内存的空间是有限的,它不能存储很大量的数据。而文件是存储在磁盘上的,存储空间上比内存要大的多。我们的业务数据都是放在数据库进行管理的,学过数据库的都知道数据库中的数据也是存放到的磁盘上的,就是因为内存空间小的这个局限性。

  • 在这里了我们是对数字的实现TopK。进行文件中整型数据的读和写,我们需要使用到的函数是fscanf和fprintf
  • 建堆有两种算法:1、向上调整算法 ;2、向下调整算法。尽管数学公式的推算证明(错位相减法+二叉树结构特点),向上调整算法的建时间复杂度是:O( n*logn)。向下调整算法的时间复杂度是O(n) 。显然,用向下调整算法是更优的,等下我们实现也是用堆的TopK也是利用向下调整算法。

fscanf函数

  • fsanf函数的接口

    在这里插入图片描述

  • fscanf函数的返回值

在这里插入图片描述
当读取到文件末尾时,fscanf函数会返回一个EOF。

fprintf函数

  • fprintf函数的接口

在这里插入图片描述

  • fprintf函数函数的返回

在这里插入图片描述

堆的TopK具体实现代码:

#include<stdio.h>
#include<time.h>
#include<stdlib.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 (size_t i = 0; i < n; ++i)
	{
		int x = rand() % 1000000;
		fprintf(fin, "%d\n", x);
	}

	fclose(fin);
}

void Swap(int* p1, int* p2)
{
	int tem = *p1;
	*p1 = *p2;
	*p2 = tem;
}

void AdjustDown(int* a, int k, int parent)
{
	int child = parent * 2 + 1;
	while (child < k)
	{
		if (child + 1 < k && 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)
{
	int* topk = (int*)malloc(sizeof(int) * k);
	const char* file = "data.txt";
	FILE* fout = fopen(file, "r");
	if (fout == NULL)
	{
		perror("fopen fail!\n");
		return;
	}
	//读k个数据
	for (int i = 0; i < k; i++)
	{
		fscanf(fout, "%d", &topk[i]);
	}
	//建堆
	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(topk, k, i);
	}
	int val = 0;
	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);
	}
	for (int i = 0; i < k; i++)
	{
		printf("%d ", topk[i]);
	}
	printf("\n");
	free(topk);
	fclose(fout);
}
int main()
{
	//CreateNDate();
	PrintTopk(10);
	return 0;
}


前K个数据的巧妙设置

需要注意的是:在造数据时,只需要调用一次就行了,然后注释掉。不然的话每一次带调用都会在“data.txt"文件中生成不同的数据。在测试的时候,由于数据量太大了不好验证是否得到Top k个数据,我们可以在文件中自己设置k个大的数据,然后查看返回的结果是不是自己设计的前k个数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行结果截图:

在这里插入图片描述可以看到,结果是正常返回到我们设置的前k个最大的数值的。

总结撒花💞

   本篇文章旨在分享的是堆的实际应用–TopK问题的相关知识。希望大家通过阅读此文有所收获
   😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

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

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

相关文章

chatgpt赋能Python-python_ip地址判断

Python IP地址判断 - 从入门到精通 如果您是一个开发人员并且经常需要处理网络相关的任务&#xff0c;那么您一定知道 IP 地址是什么。 IP 地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;是网络中用于标识设备的唯一标识符。 在本篇文章中&#xff0c;您…

chatgpt赋能Python-python_iloc

Python iLoc的使用方法及其在数据处理中的应用 Python是一种灵活的编程语言&#xff0c;可以在数据科学领域中广泛应用。在数据处理中&#xff0c;许多人都熟悉Pandas数据框架。本篇文章将介绍Pandas中的iloc方法&#xff0c;以及如何在数据处理中使用它。 iloc方法是什么? …

基于html+css的图展示87

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

CryoEM - 冷冻电镜 CryoSPARC 单颗粒图像数据集构建

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130822537 CryoSPARC 的 downsample 操作是一种用于减少数据集大小的技术,可以提高计算效率和内存使用率。downsample 操作的原理是将原始图像的分辨率降低…

SpringBoot是如何简化配置的

Spring Boot 如何简化配置&#xff1f; Spring Boot 是一个基于 Spring 框架的快速开发框架&#xff0c;它可以大大简化应用程序的配置过程。本文将介绍 Spring Boot 是如何简化配置的&#xff0c;并提供相关的代码示例。 一、自动化配置 Spring Boot 的自动化配置功能可以根…

C++【实现AVL树】

文章目录 一、AVL树的概念及性能二、AVL树结点的创建三、AVL树的插入四、四种旋转&#xff08;1&#xff09;LL-左单旋&#xff08;2&#xff09;RR-右单旋&#xff08;3&#xff09;LR-左右旋&#xff08;4&#xff09;RL-右左旋 五、判断AVL树六、测试结果七、源代码(1) AVL_…

低代码开发平台魔笔 X 浙江广电集团:“10天”成为行业最小创新单位!

客户背景概述 浙江广播电视集团&#xff08;以下简称浙江台&#xff09;是一家以广播电视为主业,兼营相关产业的综合媒体集团&#xff0c;是国内最具影响力的省级媒体之一。因新业务拓展需要&#xff0c;浙江台也需随之上线一套全新的媒资平台系统进行运营支撑&#xff0c;而新…

2023年湖北助理工程师个人申报怎么申请?

这是许多出入职场的人&#xff0c;比较关心的话题&#xff0c;想要申请一个助理工程师怎么办呢&#xff1f;助理职称好不好办&#xff1f;助理工程师职称个人怎么申请呢&#xff1f;助理工程师申需要什么材料呢&#xff1f;助理工程师申报有什么流程呢&#xff1f;甘建二现在教…

五、数据仓库详细介绍(建模)实践篇

1 数仓建模在数仓建设过程中的位置 这张截图源自之前从 0 到 1 建设数据仓库的经验总结&#xff0c;采用的是瀑布模式的展现方式&#xff0c;但实际操作中经常会使用螺旋迭代模式&#xff0c;因为很难有人能够一步到位的考虑清楚所有细节。 通过业务调研我们熟悉了相关业务过程…

手把手教你用Python编写邮箱脚本引擎

版权声明&#xff1a;原创不易&#xff0c;本文禁止抄袭、转载需附上链接&#xff0c;侵权必究&#xff01; 目录 一、邮箱知识点简介二、常见邮箱开启SMTP服务2.1 QQ邮箱​2.2 163邮箱2.3 阿里云邮箱&#xff08;企业版&#xff09;2.4 Gmail邮箱 三、Python编写邮箱引擎3.1 编…

Deferred Components-实现Flutter运行时动态下发Dart代码 | 京东云技术团队

导读 Deferred Components&#xff0c;官方实现的Flutter代码动态下发的方案。本文主要介绍官方方案的实现细节&#xff0c;探索在国内环境下使用Deferred Components&#xff0c;并且实现了最小验证demo。读罢本文&#xff0c;你就可以实现Dart文件级别代码的动态下发。 一、…

蓝精灵协会启动第二阶段的 NFT 连续发售活动

四个月前&#xff0c;蓝精灵协会推出了一款完全上链的 NFT 游戏&#xff0c;参与的钱包数量超过 85,000 个&#xff0c;并进入了前 100 Dapps 排名&#xff0c;成为了 Web3 领域的一匹黑马。 两周前&#xff0c;我们开始了第二阶段的连续销售活动&#xff0c;旨在建立一个前沿 …

privateGPT centos7环境下部署和研究

gihtub代码 https://github.com/imartinez/privateGPT 安装 llama-cpp-python-0.1.48安装报错 Could not build wheels for llama-cpp-python, , which is required to install pyproject.toml-based projects搜索&#xff08;结果较少&#xff09;&#xff1a; 从文章&#…

python数据分析与可视化学习简记(更新中)

numpy简介 numpy(Numerical Python)是python语言的扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供了大量的数学函数库 作用 Numpy是一个运行速度非常快的数学库&#xff0c;主要用于数组计算 安装 可以使用如下命令在命令行安装即可 p…

CnOpenData舆情云数据

一、数据简介 网络舆情监测数据是决策者进行数据分析和决策处置的基础。舆情云数据覆盖81000 网站、5600 论坛、1000 平面媒体、2500万 微信账号、3亿 微博账号、300 网络视频、17000 境外媒体、1400万 自媒体账号、2500 新闻客户端、170 电视台 &#xff0c;数据来源全面精准&…

Spring Boot 多环境配置

Spring Boot 多环境配置 在实际开发中&#xff0c;应用程序通常需要在不同的环境中运行&#xff0c;例如开发环境、测试环境和生产环境。每个环境可能需要不同的配置&#xff0c;包括数据库连接、日志级别、接口地址等等。Spring Boot 提供了多种方法来处理多环境配置&#xf…

【数据分享】1901-2021年1km分辨率逐月平均气温栅格数据(全国/分省/免费获取)

气温数据是我们最常用的气象指标之一&#xff0c;之前我们给大家分享过1950-2022年0.1 x 0.1精度的逐月平均气温栅格数据和逐年平均气温栅格数据&#xff08;均可查询之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是精度更高的气温栅格数据——1901-2021年1km分…

小兔鲜项目----Pinia

目录 Pinia快速入门 什么是Pinia 添加Pinia到Vue项目 使用Pinia实现计数器案例 getters实现 action如何实现异步 storeToRefs Pinia的调试 项目起步-初始化项目并使用git管理 创建项目并精细化配置 src目录调整 git 管理项目 项目起步-配置别名路径联想提示 什么是…

Cesium教程(四):调用地形服务

Cesium提供了多种现有地形数据服务接口&#xff0c;并且支持自定义地形数据。 CesiumTerrainProvider&#xff1a;高精度全球地形数据&#xff0c;附有光照和水面效果。地形切片使用quantized-mesh v1.0格式&#xff0c;Cesium使用CesiumTerrainProvider API调用该服务。 Goo…

git bash下载gitee项目报错:no such file found

错误再现 解决方案&#xff1a;设置SSH Key 第一步&#xff1a;右击git bash here&#xff0c;命令行输入 $ git config --global user.name “hcshow” //配置用户名 $ git config --global user.email “hcitlifehotmail.com” //配置用户邮箱地址 此时可以查看用户名等信息…