当前位置: 首页 > news >正文

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

前言

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的是在原有数据上手动添加的

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 浙大版《C语言程序设计(第3版)》题目集
  • JavaScript 继承百花齐放:从原型链到 ES6 类
  • 软设之TCP/IP协议
  • 软科中国大学排名爬虫+数据可视化
  • 图片管理组建
  • Flink 实时数仓(三)【DWD 层搭建(一)】
  • 《人性的枷锁:菲利普的人生探索能解开枷锁吗?》
  • 树套树模板
  • PYTHON专题-(5)类的专有方法
  • 每日学术速递8.3
  • Xilinx管脚验证流程及常见问题
  • conda环境pip 安装Tensorflow-gpu 2.10.2提示nbconvert 的包依赖冲突
  • OpenStack Yoga版安装笔记(十二)nova安装(下)
  • 林轩田机器学习基石——笔记1.2 Learn to Answer Yes/No(如何进行学习)
  • Flink 实时数仓(二)【DIM 层搭建】
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【刷算法】求1+2+3+...+n
  • Apache Pulsar 2.1 重磅发布
  • Docker 笔记(2):Dockerfile
  • ECS应用管理最佳实践
  • Electron入门介绍
  • Java知识点总结(JavaIO-打印流)
  • js
  • python_bomb----数据类型总结
  • Rancher-k8s加速安装文档
  • socket.io+express实现聊天室的思考(三)
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 实现菜单下拉伸展折叠效果demo
  • 首页查询功能的一次实现过程
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​马来语翻译中文去哪比较好?
  • !!Dom4j 学习笔记
  • # include “ “ 和 # include < >两者的区别
  • #FPGA(基础知识)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $ git push -u origin master 推送到远程库出错
  • $.ajax中的eval及dataType
  • (pycharm)安装python库函数Matplotlib步骤
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (九十四)函数和二维数组
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Mysql的优化设置
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)母版页和相对路径
  • (转)平衡树
  • (转)原始图像数据和PDF中的图像数据
  • .net core + vue 搭建前后端分离的框架
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript