算法:TopK问题

题目

有10亿个数字,需要找出其中的前k大个数字。

为了方便讲解,这里令k为5。

思路分析(以找前k大个数字为例)

很容易想到,进行排序,然后取前k个数字即可。
但是,难点在于,10亿个数字,假设每个数字都是int,就需要40亿个字节,接近40G的内存,这是很恐怖的数据,肯定不可能直接进行排序。

那我们怎么办呢?

我们可以建一个k个元素的堆
找前k大的数字建小堆,找前k小的数字建大堆
接着,将剩下N - k个数字与堆顶元素比较
如果比堆顶元素大,就进入堆,向下调整,维护好堆
遍历完所有的数字即可
最终堆里面的元素就是前k大个数字

思路虽然不好想,但是理解起来还是比较简单的,
难点在于,为什么找前k个大数字要建小堆呢?

OK,我们先假设,建大堆。
当中途找到了最大的数字,这个数字就会一直再堆顶,如果后面还有其他前k大的数字,但小于最大的数字,就会被挡住,无法进入堆。

所以找前k大个数字要建小堆,找前k小个数字要建大堆,是相同的道理。

时间复杂度分析

如果采用排序来寻找前K大个数字,时间复杂度是O(N * logN)
但是采用建堆的思路,时间复杂度是O(K + (N - K) *logK)
因为N是远大于K的,所以,时间复杂度为O(N),优于排序算法。
而且空间复杂度也非常小。

整体思路上完全优于排序算法。

代码

10亿个数据太难造了,这里就简单使用10万个数据模拟一下吧
用随机数模拟出10万个数据,接着进行打桩,在这10万个数据中造出一些特殊数据,这里为1000001,1000002,1000003,1000004,1000005

void CreateNDate()
{// 造数据int n = 100000;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;if (i == 333)x = 1000001;if (i == 444)x = 1000002;if (i == 555)x = 1000003;if (i == 666)x = 1000004;if (i == 777)x = 1000005;fprintf(fin, "%d\n", x);}fclose(fin);
}void TopK(int k)
{const char* file = "data.txt";FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}int* heap = new int[k];for (int i = 0; i < k; i++){fscanf(fout, "%d", &heap[i]);}for (int i = (k - 1 - 1) / 2; i >= 0; --i){AdjustDown(heap, k, i);}int x = 0;while (fscanf(fout, "%d", &x) != EOF){if (x > heap[0]){heap[0] = x;AdjustDown(heap, k, 0);}}for (int i = 0; i < k; ++i){cout << heap[i] << " ";}cout << endl;
}int main()
{CreateNData();TopK(5);return 0;
}

在这里插入图片描述

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

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

相关文章

浅谈树型结构——树

文章目录 一、什么是树&#xff1f;二、树的特点三、树的概念四、树的表示形式五、树的应用 一、什么是树&#xff1f; 树是一种 非线性 的数据结构&#xff0c;是树型结构。是一个由n个有限结点组成的一个具有层次关系的集合&#xff0c;这种集合因为看起来像一颗倒挂的树&am…

股指期货的详细玩法功能与应用解析

股指期货作为一种重要的金融衍生工具&#xff0c;为投资者提供了多样化的投资和风险管理手段。本文将详细探讨股指期货的三大主要功能&#xff1a;风险规避、价格发现和资产配置。 第一&#xff0c;风险规避功能 1.套期保值&#xff1a;股指期货的风险规避功能主要通过套期保值…

离线数仓ODS层准备

离线数仓ODS层设计-Operational Data Store ODS层设计要点ODS层-日志表-json表SERDEhive导入json表&#xff08;hive表和json表 字段不一致 解决方案&#xff09; 复杂数据类型日志表-建表语句 ODS层设计要点 &#xff08;1&#xff09;ODS层的表结构设计依托于从业务系统同步…

热门远程控制工具大盘点,职场必备

如果你想要进行远程数据操作那向日葵远程控制软件你肯定听说过吧。如果你是想要远程运维&#xff0c;远程办公&#xff0c;数据传输&#xff0c;这些远程控制工具都可以实现。这次我将介绍几款我身边小伙伴都在使用的远程控制工具。 1.向日葵远程控制 链接直达&#xff1a;ht…

STM32 HAL freertos零基础(十一)中断管理

1、简介 在FreeRTOS中,中断管理是一个重要的方面,尤其是在嵌入式系统中。正确地处理中断可以确保系统的实时响应能力,并且能够在中断服务程序(ISR)中执行关键操作。FreeRTOS提供了一些机制来帮助开发者管理中断,并确保在多任务环境下中断处理的安全性和高效性。 任何中…

24年云南省下半年事业单位少有人知的10个真相

云南下半年事业单位&#xff0c;已经确定了9月19号报名&#xff0c;11月2日笔试&#xff0c;关于下半年事业单位联考的一些考情&#xff0c;一次看懂: . 1⃣️专科生的岗位很多 根据过往三年的情况来看&#xff0c;云南下半年的事业单位考试&#xff0c;其实专科生有不少的岗位…

C++核心编程和桌面应用开发 第一天(命名空间 using 内联函数 默认参数 C++和C的不同)

目录 1.C的编程方式 2.双冒号::运算符 3.命名空间 3.1作用 3.2命名空间内的东西 3.3注意事项 4.using的用法 4.1using的声明 4.2using编译指令 5.C相较于C的增强 5.1全局变量检测增强 5.2函数检测增强 5.3类型转换检测增强 5.4结构体增强 5.5三目运算符增强 5.…

QT模型视图结构1

文章目录 Qt 模型视图结构概述(一)1、模型/视图结构基本原理2、模型3、视图4、代理5、简单实例 Qt 模型视图结构概述(一) ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视图组件显示模型中的数据&#xff0c;在视图组件里修改的数据会…

Dubbo SPI源码

文章目录 Dubbo SPI使用方式AOP功能源码剖析SPI注解1.获取加载器2.获取拓展实例对象3.创建拓展类的实例对象 Dubbo SPI Dubbo 的 SPI&#xff08;Service Provider Interface&#xff09;机制是一种强大的扩展机制&#xff0c;它允许开发者在运行时动态地替换或增加框架的功能。…

SafaRi:弱监督引用表达式分割的自适应序列转换器

引用表达式分割(reference Expression Segmentation, RES)旨在提供文本所引用的图像(即引用表达式)中目标对象的分割掩码。 目前存在的挑战 1)现有的方法需要大规模的掩码注释。 2)此外&#xff0c;这种方法不能很好地推广到未见/零射击场景 改进 1&#xff09;提出了一个弱…

Cobbler 搭建方法

统信服务器操作系统行业版V20-1000c【Cobbler 搭建】手册 统信服务器操作系统行业版 V20版本上Cobbler 搭建方法 文章目录 功能概述一、使用范围二、cobbler工作流程1. Server 端2. Client 端三、 环境准备1. 测试环境告知,以提供配置时参考:2. 关闭防火墙、selinux:3. 注意…

优化深度学习模型训练过程:提升PASCAL VOC 2012数据集上Deeplabv3+模型训练效率的策略

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 优化说明&#xff1a; 避免重复下载和解压数据集&#xff1a;将downloadTrue改为downloadFalse&#xff0c;防止每次运行代码都重新下载和解压数据集&#xff0c;从而节省时间。 使用pin…

【C++】stack 和 queue 以及 容器适配器

文章目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 三、优先级队列1.优先级队列的介绍2. priority_queue的使用的使用3.模拟实现优先级队列 四、 容器适配器1.STL标准库中stack和queue的底层结构2.deque&#xff08;双端对列…

OS:初识操作系统——邂逅与启航

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;实践是检验真理的唯一标准&#xff01;&#xff01;&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 前言 各位uu好&#xff0c;现在我们要开始一个新的篇章——操作…

Geneformer AI 模型,有限数据也能解锁基因网络

目录 类似于 BERT 的单单元数据参考模型 NVIDIA Clara 工具组合用于药物研发 用于疾病建模的基础 AI 模型 Geneformer 是最近推出的 和功能强大的 AI 模型&#xff0c;可以通过从大量单细胞转录组数据中进行迁移学习来学习基因网络动力学和相互作用。借助此工具&#xff0c;…

misc合集(1)

[Week3] 这是一个压缩包 有密码&#xff0c;提示QmFzZUNURj8/Pz8/P0ZUQ2VzYUI base64解密是BaseCTF??????FTCesaB 猜测这应该是⼀个轴对称的密码 python ⽣成了密码字典&#xff0c;再通过 ARCHPR 进⾏字典爆破 lowercase abcdefghijklmnopqrstuvwxyz uppercase l…

java写s7和plc通讯

pom.xml <dependency><groupId>com.github.s7connector</groupId><artifactId>s7connector</artifactId><version>2.1</version></dependency>maven下载不了的&#xff0c;下载包&#xff0c;评论或者私自内免费给 DB212 类&a…

5.1 溪降技术:个人装备

Content 5.1 个人装备概览设备概览视频电子书&#xff1a;个人装备安全装备非安全装备 峡谷探险个人安全装备个人安全装备视频*安全扣结构*峡谷探险个人非安全装备 湿峡谷湿峡谷装备视频个人安全装备个人非安全装备 干峡谷干峡谷装备视频个人安全装备个人非安全装备 团队装备&a…

安全区域边界等保测评

1.边界防护 应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信。 [测评方法] 1)应核查在网络边界处是否部署访问控制设备;网闸和防火墙2)应核查设备配置信息是否指定端口进行跨越边界的网络通信,指定端口是否配置并启用了安全策略acl 3)应采用其他技术手…

【网盘外快】百度网盘SVIP充值使用说明,如何通过软件自动充值获取新用户优惠?这篇文章给你正确答案。

资源地址&#xff1a; 此软件需要 网盘ck 才可以使用。 雷电模拟器下载地址&#xff1a;https://www.ldmnq.com/ 软件下载地址&#xff1a;https://wwi.lanzoup.com/b01qdiavzg 密码:666 模拟器使用说明&#xff1a; 1、调整模拟器分辨率调整为&#xff1a;540 X 960。 2、…