TopK问题的必会解法
目录
- 经典解法,创建K个大小的堆
- 不考虑空间的暴力排序做法
- 不考虑空间的快排partition变形减治法思想(核心:找第K大的数)
- 空间有限放不下,海量数据的分治法
经典解法,创建K个大小的堆
传统的直接建立一个K个元素的小顶堆,类似堆排序的思想, 然后将剩下的n-k个元素依次和堆顶元素比较,如果大于堆顶,就替换掉堆顶,然后向下调整到合适的位置,以此类推,最后这个堆中剩下的K个元素就是topK元素; 时间O (n logk) 空间O(k) ;相对来说是比较优的;
不考虑空间的暴力排序做法
归并等排序…时间O(NlogN) O(N)
时间上更优O(N): 类似于计数排序的映射思想,直接创建一个存的下所有int数字的数组,全按照原数据下标的index位置映射存进一个数组,出现一次数组的内容cnt++一次,之后从数组的末尾开始,从后往前遍历(topK)出来k个数字即可; 时间O(n)空间O(n); 是更快了一点哈; 但是这样有点太暴力了…
不考虑空间的快排partition变形减治法思想(核心:找第K大的数)
这里的减治法与分治法的区别(抽象举例):
处理元素以这个序列为例:111 2 333
分治法: 假设以2为基准,我们把序列分为了111 和 333两部分,进而对这两部分继续按照一定的规则分治处理;
减治法:假设以2为基准,我们找的是第3大的数,那么111直接被丢弃,我们只需要对333进一步减治处理即可,与分治法比较,省去了对排除部分进行分支处理的开销!
思路:
找到第K大的数字(借助快排的partion思想返回的pos区分左右两个侧大小的下标和二分的减治思想!注意:有重复也不影响哦; 前k大的数字 可以有多个一样的呀!)
然后再利用这个数字进行一次快排的partition,通过返回的下标,区分左右两侧,就能确定topK的数字了;
注意下图是找到第K小的数字(第k大还是小,取决于我们partition左侧方的是>=基准值得数还是<=基准值的数)
找到第K大的数字以后; 进行一次partion,>=他的放在右边,那么右边就是前K大的了;
(同理,前k小,就找第k小,一次partion左边都是<= 的前k小了)
我们只在一段序列中partion出对应第k大的数字位置的下标即可,其他淘汰的字段不用再partion了,这种方法就避免了对除了Top K个元素以外的数据进行排序所带来的不必要的开销。
空间有限放不下,海量数据的分治法
将全部数据等分成N份,(N份前提是每份的数据都可以读到内存中进行处理),找到每份数据中最大的K个数;
再把这一共:N*K个(N份*每份的K个)的数据放入内存处理,可以用快排变形或者归并排序等;
(注意:如果N*K个如果又放不下,那么以此类推,继续分治,拿N*K个数据等分成每份M份(M份前提是放的进内存的粒度),再找topK,再把M*K个合起来放入内存用快排变形或者排序处理,以此类推;
TopK问题的必会解法相关推荐
- 关于某日访问次数最多的IP的topK问题的三种解法
题目描述 在july大神的博客中,看到这样两道题: 1. 海量日志数据,提取出某日访问百度次数最多的那个IP. 2. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复 ...
- TopK问题的三种解法
TopK问题是指从n个数据中取前K个数据,在生活中的应用也有很多,如游戏中xxx的排行榜前10名等.在这篇博客中我将主要利用堆去解决TopK问题. 堆排序 首先我们需要建一个堆,然后我们再进行堆排序, ...
- 飘逸的python - 大数据TopK问题的quick select解法
TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词. 方法一: 先排序,然后截取前k个数. 时间复杂度:O(n*logn)+O(k)=O(n*logn) ...
- 数据结构面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
最全面试题,精心整理100家互联网企业面经,祝你面试成功.面试必过(2023优化版)已发布在个人微信公众号[面向Offer学编程],优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结, ...
- 机器学习面试问题总结
机器学习算法面试问题 美团AI算法 1. xgboost原理,怎么防过拟合 2. gbdt推导 3. boosting和bagging在不同情况下的选用 4. DBSCAN原理和算法伪代码,与kmea ...
- 《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明
先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/artic ...
- 技术面常见问题(持续更新)
一.数学基础: 1.微积分 1.SGD,Momentum,Adagard,Adam原理 SGD为随机梯度下降,每一次迭代计算数据集的mini-batch的梯度,然后对参数进行更新. Momentum参 ...
- 结构体在cuda核函数里面不能用吗_求职招聘 | 面试机器学习职位,这些知识点你都会了吗?...
『运筹OR帷幄』转载 求职招聘栏目 来自于运筹帷幄的招聘板块.一方面,我们将为大家精心挑选和整理全球与运筹学.数据科学.机器学习.人工智能等领域相关的招聘职位.另一方面,我们也将翻译和转载国内外在该领 ...
- kmeans聚类算法_机器学习/算法校招面试考点汇总(附面试题和答案)【持续更新】_笔经面经...
以下不作为机器学习/算法工程师的学习路径,只是汇总的校招机器学习/算法工程师面试考点(因为还有笔试考点,后面结合在一起给大家学习路径),后续会为大家更新10w+字数的机器学习/算法工程师校招面试题库, ...
最新文章
- python处理csv文件 sql_如何用python将csv文件写入sql数据库
- Asp.Net第一章入门之后台处理程序
- iOS获取自1970年毫秒数使用OC和swift两种语法,返回字符串
- 空间谱专题10:MUSIC算法
- 【十二省联考2019】皮配【分部dp】
- 为什么现在的年轻人越来越不愿意结婚、生子了?
- c语言爱心代码(c语言画爱心的代码)
- 在字节实习8个月后,成功转正
- 安装JDK与配置java环境变量
- 2017第48周日昨天休息
- AE学习日记之MapControl与PageLayoutControl图层变化同步
- 库存盘点遗失设备寻找中的个人收获
- Vue的生命周期是什么
- Newline —— CRLF、LF、CR回车和换行
- spidev0.0的正确打开方式
- c语言通过epoll来实现http协议的web服务器
- 修改win7开机登陆界面背景图片
- 获取32位整型变量中某一位的bit值
- 如何编译门禁APP,人脸识别功能运行
- 计算机有60进制吗,60进制介绍