TopK问题与如何在有限内存找出前几最大(小)项(纯c语言版)

目录

0.前言

1.知识准备

2.实现

1.首先是必要的HeapSort

2.造数据

其他注意事项

 3.TopK的实现


0.前言

在我们的日常生活中总有排名系统,找出前第k个分数最高的人,而现在让我们用堆来在有限内存中进行实现

1.知识准备

想要实现topk问题首先我们要有堆排序的知识 如果想要了解的可以看我这一篇堆的实现与堆排序(纯C语言版)-CSDN博客

2.实现

首先我们很容易想到,方法1就是建一个N个数的大堆,然后Pop k次这样我们就得到了前k个大的数,但是这样有个缺陷,当数据量过大时,我们将会浪费大量的内存,如要读取10亿个整数的话,需要大约4G的内存

那我们可以在1KB的情况下完成这个吗,答案是可以的

我们可以先建立一个只有K个数的小堆,然后后面读取的数据与堆顶数据比较,满足要求则覆盖掉堆顶数据再向下调整,只需要这样我们就只用不到kb实现了大数据的topk问题

接下来让我们看代码的实现

1.首先是必要的HeapSort

void HeapSort(elementType* arr,int size)
{//O(Nlogn)//for (int i = 0; i < size; i++)//{//	AdjustUp(arr, i);//}//O(n)for (int i = (size - 1 - 1)/2; i >= 0; i--){AdjustDown(arr, i, size);}//进行排序 排序实质进行交换int end = size - 1;while (end>0){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}}
void AdjustDown(elementType* arr, int parent, int size)
{int child=parent*2+1;while (child< size){//先比较左右孩子的大小 小堆举例if (child + 1 < size && arr[child] > arr[child + 1])//child++;if (arr[parent] > arr[child]){Swap(&arr[parent], &arr[child]);parent = child;child = child * 2 + 1;}else{break;}}}

2.造数据

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);//1.注意在后面加上换行符向2.向文件中打印每个1000000以内的随机数}fclose(fin);
}

其他注意事项

当我们检测我们的程序是否正确的时候或者当我们发现我们程序出现了错误的时候,我们可以减少数据量,控制数据范围,手动添加特殊数据,就以我们的上面这个举例,当我们光看我们是否选择正确是相当困难的但是可以进行数据范围的控制可以

将int x = rand() % 1000000;

改为int x = rand() % 100;

这样数据范围就变为了0~99然后我们再去手动在我们生成的数据中添加特殊数据,这样我们就很容易就知道我们的程序是否正确

 3.TopK的实现

时间复杂度为O(\log k*(N-K))即深度(调整次数)乘以个数

void test03()//Topk解决方法2 只用k个整形数组的数据
{FILE* file = fopen("data.txt", "r");//先读取10个数据来进行堆的建立int k = 0;printf("请输入你要查找的前几大数据");scanf("%d", &k);int* arr = (int*)malloc(sizeof(int) * k);for (int i = 0; i < 10; i++){fscanf(file, "%d", arr+i);}//先建立一个能够存储10个数据的堆for (int i = (k-1-1)/2; i>=0; i--){AdjustDown(arr, i, k);}//然后开始读取后n-k个int x = 0;while (~fscanf(file,"%d",&x)){if (x > arr[0]){arr[0] = x;AdjustDown(arr, 0, k);}}printf("前k个最大数为->");HeapSort(arr, k);for (int i = 0; i < k; i++){printf("%d ", arr[i]);}fclose(file);free(arr);}

学习笔记fscanf中第一个参数要写要读的文件名,第二个要写读取的格式,第三个是接受的元素然后啊fscanf的返回值与为什么要加上~这个取反符号,fscanf是有返回值的当读取成功返回0,当读取失败返回-1取反为0
其他注意事项,记得关闭文件与释放内存

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

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

相关文章

Linux运维:mysql高级查询语句(2)

目 录 一、创建数据库&#xff1a; 二、创建表结构&#xff1a;DDL 2.1 学生表s&#xff1a; 2.2 成绩表sc&#xff1a; 2.3 课程表c&#xff1a; 三、录入数据&#xff1a;DML 3.1 对学生表s的数据录入&#xff1a; 3.2 对成绩表sc的数据录入&#xff1a; 3.3 对课…

【Kaggle】Telco Customer Churn 电信用户流失预测案例

⭐️前言&#xff1a;案例学习说明与案例建模流程 我们将围绕Kaggle中的电信用户流失数据集&#xff08;Telco Customer Churn&#xff09;进行用户流失预测。在此过程中&#xff0c;将综合应用此前所介绍的各种方法与技巧&#xff0c;并在实践中提炼总结更多实用技巧。 ⭐️对…

期权交易指南:为什么要交易场外个股期权?

今天带你了解期权交易指南&#xff1a;为什么要交易场外个股期权&#xff1f;随着金融市场的发展和创新&#xff0c;投资者寻求更多的工具来管理风险和获得更高的回报。场外期权交易应运而生&#xff0c;成为一种重要的金融衍生品交易方式。 简单来说就是期权是一种合约&#…

Mysql 的账户管理,索引,存储引擎

目录 一.MySQL的账户管理 1.存放用户信息的表 2.查看当前使用的用户 3.新建用户 4.修改用户名称 5.删除用户 6.修改用户密码 7.破解密码 8. 远程登录 9.用户权限管理 9.1 权限类别 9.2 查看权限 9.3 授予权限 9.4 撤销权限 二.索引 1. 索引管理 1.1 查看索…

麒麟v10-sp3安装kkfileview

1、上传包到服务器 执行&#xff1a;/bin/startup.sh 会自动安装LibreOffice&#xff0c;因为/bin/install.sh判断了不是redhat-release就是ubuntu&#xff0c;导致麒麟系统会走ubuntu&#xff0c;所以会失败&#xff0c;这里改一下如果是麒麟也走install_redhat就可以了 也…

服务器日志事件ID4107:从自动更新 cab 中提取第三方的根目录列表失败,错误为: 已处理证书链,但是在不受信任提供程序信任的根证书中终止。

在查看Windows系统日志时&#xff0c;你是否有遇到过事件ID4107错误&#xff0c;来源CAPI2&#xff0c;详细信息在 http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab 从自动更新 cab 中提取第三方的根目录列表失败&#xff0c;…

【存储】相关内容

【存储】相关内容 1. 存储类型1. 块存储2. 文件存储3. 对象存储4. 三种存储类型对比 2. 常见的存储分类1. DAS2. SAN3. NAS4. 存储分类分析比较 3. 一些存储的概念1. LUN2. volume3. HBA4. iSCSI 1. 存储类型 块存储和文件存储是我们比较熟悉的两种主流的存储类型&#xff0c;…

解决OneDrive “拒绝访问文件” 问题

问题描述&#xff1a; 在尝试将其他文件拖入oneDrive或是打开OneDrive中的文件时。出现如下报错&#xff1a; 拒绝访问文件 无法访问XXXXXXX中的文件。可能已移动或删除了此文件&#xff0c;或者受制于文件权限而不能访问。 ERR_ACCESS_DENIED 解决办法&#xff1a; 1. 找到O…

JavaEE—什么是服务器?以及Tomcat安装到如何集成到IDEA中?

目录 ▐ 前言 ▐ JavaEE是指什么? ▐ 什么是服务器&#xff1f; ▐ Tomcat安装教程 * 修改服务端口号 ▐ 将Tomcat集成到IDEA中 ▐ 测试 ▐ 结语 ▐ 前言 至此&#xff0c;这半年来我已经完成了JavaSE&#xff0c;Mysql数据库&#xff0c;以及Web前端知识的学习了&am…

notepad++安装并打开json文件

1、notepad安装 1、首先下载Notepad.exe 2、选择简体中文安装 点击下一步 点击“我接受” 选择安装目录&#xff0c;进行下一步安装 默认下一步 选择安装 等待安装完成 点击完成 2、保存json文件 复制返回结果 先把返回结果复制出来。保存到text里面 把文件另存为json格式 3、…

安卓手机的自带录屏在哪里找?5个软件帮助你快速给手机录屏

安卓手机的自带录屏在哪里找&#xff1f;5个软件帮助你快速给手机录屏 在安卓手机上进行屏幕录制是一项非常实用的功能&#xff0c;特别是对于需要录制游戏操作、制作教程或演示的用户来说。虽然部分安卓手机可能已经预装了屏幕录制功能&#xff0c;但有时候这些功能可能隐藏在…

prometheus 安装node_exporter, node_exporter 安装最新版 普罗米修思安装监控服务器client

1. 本文介绍两种安装方式&#xff0c;一种安装为service,使用systemctl start node_exporter管理&#xff0c;第二种为安装docker内 容器内使用。 1.1 安装到系统内&#xff1a; 1.1.1 github地址&#xff1a; Releases prometheus/node_exporter GitHub ​ 1.1.2 下载命…

JS数据处理(冒泡寻找对象里面有个Key相同的值并处理相关数据)

1.需要处理成的数据格式 [{ mpptNumber: 1, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvEnableStatus: 0,pvSerialNumber: 2,}] }, { mpptNumber: 2, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvE…

【总线】AXI4第四课时:握手机制详解

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

炎黄数智人:国家体育总局冬运中心——AI裁判与教练“观君”赋能冰雪运动新篇章

在科技创新的浪潮下&#xff0c;国家体育总局冬季运动管理中心&#xff08;以下简称“冬运中心”&#xff09;揭开了人工智能在体育领域应用的新篇章。隆重宣布推出革命性的AI裁判与教练系统——“观君”&#xff0c;该系统将在冰雪运动项目中大放异彩&#xff0c;为运动员的训…

Administrators就最高了???system是什么??本地用户提权内网学习第三天 你知道uac是什么??

我们今天来说说本地用户提权的操作&#xff0c;我们在有webshell过后我们要进行进一步的提权操作&#xff0c;要不然对我们后期的内网渗透会有一些阻碍的操作。比如说我们使用mimikatz来进行抓取密码&#xff0c;就不能够成功。 Administrators与system的区别 我们来说说Admin…

OpenBayes 教程上新 | CVPR 获奖项目,BioCLlP 快速识别生物种类,再也不会弄混小浣熊和小熊猫了!

市面上有很多植物识别的 App&#xff0c;通过对植物的叶片、花朵、果实等特征进行准确的识别&#xff0c;从而确定植物的种类、名称。但动物识别的 App 却十分有限&#xff0c;这使我们很难区分一些外形相似的动物&#xff0c;例如小浣熊和小熊猫。 左侧为小浣熊&#xff0c;右…

Springboot项目实训--day1

目录 一、软件安装 二、软件的简单了解 三、基础知识应用 1、四个常用注释 2、尝试新建类 3、控制反转&#xff08;IOC容器&#xff09; 4、返回数据给浏览器 5、浏览器传回数据给服务器 易错点 一、软件安装 需要安装的软件是idea专业版&#xff0c;刚使用的时候可以使…

3dmax如何制作全景图?渲染100邀请码1a12

全景图很常见&#xff0c;制作起来也简单&#xff0c;这里我给大家稍微分享下。 1、创建相机 打开要渲染全景的场景文件&#xff0c;创建相机并调整好位置。 2、 设置分辨率 按F10打开渲染设置界面&#xff0c;选择相机视口&#xff0c;在公用里设置宽度和高度&#xff0c;…

HarmonyOS开发探索:自定义键盘-webview

场景描述 在特殊的H5场景下需要应用拉起自定义键盘进行输入。 场景一&#xff1a;使用jsBridge拉起自定义弹窗写自定义键盘&#xff0c;再通过jsBridge传参实现输入。 场景二&#xff1a;使用web的同层渲染将原生textInput组件渲染到页面上。 方案描述 通过注册一个js代理…