TopK问题

前言:本篇对TopK问题的解答是介于堆的基础上讲的

TopK问题:

就是在许多数据中找到前K个最大的数据或者最小的数据

比如:专业前10、世界五百强、富豪榜、以及游戏排行榜等等

对于TopK问题:能想到的最简单直接的方式就是排序解决,通常包括排序、堆排序、快速选择等排序算法,但是如果数据量太大了,排序就不太可能了(可能数据都不能一下子全部加载到内存中),用到堆排序的方法能够大大减少计算时间和内存需求,反而能得到很高的效率


怎么做?

最开始第一想法肯定是,将所有数据建立成K个堆,然后将K堆的堆顶元素Top(取)出来,得到的就是每个堆的最大/最小的元素,但是呢?这样的话,需要的空间还是挺大的,那么有没有其他办法能够做到,占用少量的空间,完成巨大的任务量呢??

尝试着以K个元素只建一个堆,空间减小了很多,由堆的性质,这个问题好像就迎刃而解了!我们将后n-k个数全部比较,每放进去一个元素又调整成堆,也就是每次堆顶元素都是最小值,堆顶元素(最小值)找到比他大的就会被Pop掉,当后N-K个元素比较完后,最后留在堆里的不就是最大的K个数么

 来实现一下10个最大的元素,这里我们用到rand函数和srand以及time生成随机数,即将伪随机变成随机来创建一些数据来进行,当然为了验证,自己可以在最后的数据加10个最大数据,验证即可;这里建堆用的向下排序建堆,因为相比于向上排序建堆,时间复杂度更低

#define _CRT_SECURE_NO_WARNINGS 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//交换函数
void Swp(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
//打印:
void INPrin(int* a,int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}}
//向下调整:小堆
void AdjustDownSmall(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//假设法:谁小,小的孩子往上走//因为会有孩子没有兄弟if (a[child] > a[child + 1] && child + 1 < n){child = child + 1;}if (a[child] < a[parent]){Swp(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void createndate()
{//造数据:int n = 10000;//设置种子:随机数srand((unsigned int)time(NULL));//以写的形式打开文件;FILE* fp = fopen("data.txt", "w");if (fp ==NULL){perror("fopen");return;}//数据个数:for (int i = 0; i < n; i++){//生产0-10000的随机数int ret = (rand()+i) % n;fprintf(fp, "%d\n", ret);}//验证for (int j = 3*n; j < 3*n + 11; j++){fprintf(fp, "%d\n", j);}fclose(fp);fp = NULL;
}
//top-k问题:得到最大的k个数
void printtopk(int k)
{//打开文件(读)FILE* fp = fopen("data.txt", "r");if (fp == NULL){perror("fopen");return;}int* a = (int*)malloc(sizeof(int) * k);if (a == NULL){perror("malloc");return;}//int i;for (i = 0; i < k; i++){fscanf(fp, "%d", &a[i]);}//前k个建小堆:(向下调整)时间复杂度为:o(n)for (i = (k - 1 - 1) / 2; i > 0; i--){AdjustDownSmall(a, k, i);}int x = 0;while (fscanf(fp, "%d", &x) >0){//进行比较并xiangxia调整if (a[0] < x){a[0] = x;AdjustDownSmall(a, k, 0);}}INPrin(a, k);
}int main()
{//createndate();printtopk(10);return 0;
}

 当然结果并非有序的,想让它有序其实就是堆排序的操作,对这10个元素,不断取栈顶元素,放到数组就能排序好

 x感谢观看,下次见

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

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

相关文章

fastadmin二次开发 修改默认的前端弹出样式

需要修改fastadmin后台默认的弹出提示样式效果&#xff1a; 在项目里搜索这个关键词&#xff1a;Toastr 首先这个文件&#xff0c;里面的success和error就是弹出提示的方法。 public/assets/js/fast.js 然后是下面这个文件&#xff1a; public/assets/js/require-form.js 你…

对于高速信号完整性,一块聊聊啊(13)

前面一篇说了有源仿真和无源仿真的区别&#xff0c;今天介绍一下前仿真和后仿真。 一个完整的电路设计中必然包含前仿真和后仿真两个部分&#xff0c;它们都属于验证的必要环节。 尤其是在复杂的芯片设计中&#xff0c;验证要占用整个芯片设计流程时间的60%-70%。目的就是尽可…

解析气膜场馆造价—轻空间

随着社会的发展和对环保及时间成本的重视&#xff0c;气膜场馆逐渐成为众多体育场馆的首选建筑模式。气膜建筑包括气膜篮球场、气膜室内足球场、气膜羽毛球场、气膜乒乓球馆、气膜网球场以及气膜滑冰场等&#xff0c;因其多项优势受到广泛应用。 气膜场馆的显著特点 1. 气膜场馆…

aosp14的分屏接口ISplitScreen接口获取方式更新-学员疑问答疑

背景&#xff1a; 有学员朋友在学习马哥的分屏pip自由窗口专题时候&#xff0c;做相关分屏做小桌面项目时候&#xff0c;因为原来课程版本是基于android 13进行的讲解的&#xff0c;但是现在公司已经开始逐渐进行相关的android 14的适配了&#xff0c;但是android 14这块相比a…

2024年上半年系统架构设计师——案例第二题——UML相关

这个只记到一个大概了 主题干&#xff0c;说明人员访客系统 题目1 9分 问序列图信息类型和特点 题目2 序列图填空 好像是10分吧 访客系统的序列图 题目3 6分 说明软件分析和设计时的和UML图有关原则&#xff1f;

展厅设计要做好需要考虑哪些要素

1、展示主题 企业展厅要有一个明朗的展示主题&#xff0c;不止是为了为展厅设计提供方向&#xff0c;也是为了让参观者更好地了解和认识企业。通过精心策划的展示主题&#xff0c;打造一个富有情感和故事性的展示空间&#xff0c;可以快速感染到参观者&#xff0c;使其能够在参…

Go使用结构体实现类(面向对象)

前置 package main ​ import ("fmt" ) ​ // 矩形结构体 type Rectangle struct {Length intWidth int } ​ // 计算矩形面积 func (r *Rectangle) Area() int {return r.Length * r.Width } ​ func main() {r : Rectangle{4, 2}// 调用 Area() 方法&#xff0c;计…

幼儿园管理系统-收退费管理原型模版

幼儿园管理系统是专为幼儿园打造&#xff0c;涵盖学校儿童、职工人事、收费财务、后勤管理、办公教务、膳食分析、体检保健、文档管理等各方面内部管理的幼儿园专家系统。 本次分享给大家的是雅居乐教育集团幼儿园园务管理系统中“收退费管理”模块的设计文档。收退费管理是幼儿…

代码+视频,总结R语言常用的几种按条件转换数据的方法

在科学研究中免不了和数据打交道&#xff0c;收集到原始数据后我们经常需要对其进行清洗、转换才能得到我们需要的数据。 今天我总结了一下自己常用的一些多条件的数据转换方法&#xff0c;在临床中遇到问题能多一种选择&#xff0c;下面视频操作演示一下 总结R语言常用的几种按…

深度学习 --- stanford cs231 编程作业(如何在chrome中安装Google colab)

stanford cs231 编程作业(如何开始你的colab编程&#xff09; 斯坦福231n的所有作业都要求在colab里面做&#xff0c;colab可以为你提供免费的云计算。实际上在他的官网中也有关于如何安装colab的详细说明视频。 https://youtu.be/DsGd2e9JNH4https://youtu.be/DsGd2e9JNH4 我这…

Unity入门理论+实践篇之Luna

创建世界的主角 父子物体 首先创建一个cube物体 可以观察到其在2D视角下的坐标为&#xff08;0&#xff0c;0&#xff09; 此时将cube物体拖拽到ldle_0下&#xff0c;如图所示&#xff0c;并将其坐标值改为&#xff08;2&#xff0c;2&#xff09; 此时再将ldle_0物体的坐标…

95.网络游戏逆向分析与漏洞攻防-ui界面的设计-ui的设计与架构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

基于jeecgboot-vue3的Flowable新建流程定义(二)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 4、编辑好后进行保存&#xff0c;保存代码如下&#xff1a; /*保存流程定义*/const save (data: any) > {//console.log("save data", data); // { process: {..…

博客增长与数据分析:不可不知的 6 大策略

CSDN 的朋友你们好&#xff0c;我是何未来&#xff0c;一个热爱编程和写作的计算机本科生&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第 11 篇文章“分析和追踪博客表现”。本篇文章为你揭示了如何通过数据洞察来优化你的技术博客&am…

-bash: locate: 未找到命令(解决办法)

-bash: locate: 未找到命令的解决办法 一、解决办法二、什么是locate三 、locate命令的具体用法 一、解决办法 CentOS7默认没有安装locate命令&#xff0c;安装方式如下&#xff1a; 执行以下命令进行安装&#xff1a; yum install mlocate用 updatedb 指令创建 或更新locate …

数学建模--LaTeX基本介绍和入门

1.引言 &#xff08;1&#xff09;上次我们介绍到了我们这个团队第一次参加这个数学建模比赛&#xff0c;就是这个电工杯&#xff0c;我是一名论文手&#xff0c;我们在这个下午也是对于这个比赛过程中出现的问题做了相应的分析&#xff0c;每个人也是进行了反思&#xff0c;知…

Tomcat源码解析(七):底层如何获取请求url、请求头、json数据?

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a;Tomcat整体架构 Tomcat源码解析(二)&#xff1a;Bootstrap和Catalina Tomcat源码解析(三)&#xff1a;LifeCycle生命周期管理 Tomcat源码解析(四)&#xff1a;StandardServer和StandardService Tomcat源码解析(五)&…

最大连续1的个数(滑动窗口)

算法原理&#xff1a; 这道题大眼一看是关于翻转多少个0的问题&#xff0c;但是&#xff0c;如果你按照这种思维去做题&#xff0c;肯定不容易。所以我们要换一种思维去做&#xff0c;这种思维不是一下就能想到的&#xff0c;所以想不到也情有可原。 题目是&#xff1a;给定一…

Vue3:动态路由+子页面(新增、详情页)动态路由配置(代码全注释)

文章目录 实现思路调用后端接口获取用户权限获取页面权限动态绑定到路由对象中动态添加子页面路由 实现思路 emm&#xff0c;项目中使用动态路由实现根据后端返回的用户详情信息&#xff0c;动态将该用户能够访问的页面信息&#xff0c;动态生成并且绑定到路由对象中。但是后…

如何从清空的回收站中恢复已删除的Excel文件?

“嗨&#xff0c;几天前我删除了很多没有备份的Excel文件。回收站已清空。当我意识到我犯了一个大错误时&#xff0c;所有的Excel文件都消失了&#xff0c;回收站里什么都没有。清空回收站后是否可以恢复已删除的 Excel 文件&#xff1f; 回收站是一种工具&#xff0c;可让您在…