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

news/2024/10/23 9:40:35/

【追梦之旅】— 堆的实际应用--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.ppmy.cn/news/90884.html

相关文章

DZ应用中心”对不起,您的网站已被设置禁止下载此应用“完美解决办法

应用中心开发平台Discuz!扩展中心防骗云平台专门针对所谓的盗版网站进行屏蔽网站授权,造成众多无辜站长用户无法更新和下载应用中心插件、模板,如果遇到下载提示:”对不起,您的网站已被设置禁止下载此应用“,完美解决办法如下: 后台——站长——数据库——升级(需要将 c…

算法--负二进制数相加

题目 给出基数为 -2 的两个数 arr1 和 arr2&#xff0c;返回两数相加的结果。 数字以 数组形式 给出&#xff1a;数组由若干 0 和 1 组成&#xff0c;按最高有效位到最低有效位的顺序排列。例如&#xff0c;arr [1,1,0,1] 表示数字 (-2)^3 (-2)^2 (-2)^0 -3。数组形式 中…

JavaScript JSON

JavaScript Object Notation&#xff08;JSON&#xff09;是一种轻量级的数据交换格式&#xff0c;通常用于服务器和Web应用程序之间的数据传输&#xff0c;以及数据的存储和结构化。JSON基于JavaScript编程语言的一个子集&#xff0c;通常与JavaScript一起使用。 JSON将数据表…

Git进阶+Jenkins入门

文章目录 1 Git进阶——GitFlow工作流程1.1 master与develop分支1.1.1 master1.1.2 develop 1.2 feature分支1.3 Release分支1.4 hotfix分支1.1.3 1 Git进阶——GitFlow工作流程 1.1 master与develop分支 1.1.1 master master&#xff1a;发布上线分支&#xff0c;基于master打…

2023-05-26 创业的一些想法-分析

关于草创初期: 立足于技术本身是不够的, 需要更为宏大的视角赛道是一种关于现在和未来的&#xff0c;需要结合自身的潜质,资源来做出, 但是过低的门槛意味着除了技术本身之外的竞争资源永远不可能够, 在草创更为凸显, 不过往好的方面看, 此时还没有将资源进行巨量投入, 所以避免…

成员属性辨析:Python 中的实例属性与静态属性

文章目录 参考描述成员属性实例属性&#xff08;Instance Attributes&#xff09;静态属性&#xff08;Static Attributes&#xff09; 实例属性与局部变量形参 self不只是 self实例属性与局部变量 参考 项目描述Python 官方文档https://docs.python.org/zh-cn/3/搜索引擎Goog…

企企管理云是什么应用?如何自动同步数据至企企管理云

企企管理云是什么应用&#xff1f; 企企管理云&#xff0c;是企企科技依托创始团队30年企业级管理软件实践与服务经验&#xff0c;坚持技术和产品立业&#xff0c;逐步构建的企业经营管理一站式服务平台。企企管理云围绕「现代服务业」的业财一体化&#xff0c;聚焦于项目管理…

IPEmotion采集J1939协议信号

一 背景 由于商用车相对于乘用车更注重实用性&#xff0c;功能也较单一&#xff0c;且具有产量小的特点&#xff0c;因此在设计开发时需要进行约束&#xff0c;以更大程度实现软硬件的复用和成本的降低&#xff0c;在此需求下J1939协议便随之产生了。 J1939协议是由美国汽车工…