目录

  • 经典解法,创建K个大小的堆
  • 不考虑空间的暴力排序做法
  • 不考虑空间的快排partition变形减治法思想(核心:找第K大的数)
  • 空间有限放不下,海量数据的分治法

经典解法,创建K个大小的堆

传统的直接建立一个K个元素的小顶堆,类似堆排序的思想, 然后将剩下的n-k个元素依次和堆顶元素比较,如果大于堆顶,就替换掉堆顶,然后向下调整到合适的位置,以此类推,最后这个堆中剩下的K个元素就是topK元素; 时间O (n logk) 空间O(k) ;相对来说是比较优的;

不考虑空间的暴力排序做法

  1. 归并等排序…时间O(NlogN) O(N)

  2. 时间上更优O(N): 类似于计数排序的映射思想,直接创建一个存的下所有int数字的数组,全按照原数据下标的index位置映射存进一个数组,出现一次数组的内容cnt++一次,之后从数组的末尾开始,从后往前遍历(topK)出来k个数字即可; 时间O(n)空间O(n); 是更快了一点哈; 但是这样有点太暴力了…

不考虑空间的快排partition变形减治法思想(核心:找第K大的数)

这里的减治法与分治法的区别(抽象举例):

处理元素以这个序列为例:111 2 333

  • 分治法: 假设以2为基准,我们把序列分为了111 和 333两部分,进而对这两部分继续按照一定的规则分治处理;

  • 减治法:假设以2为基准,我们找的是第3大的数,那么111直接被丢弃,我们只需要对333进一步减治处理即可与分治法比较,省去了对排除部分进行分支处理的开销!

思路:

  1. 找到K大的数字(借助快排的partion思想返回的pos区分左右两个侧大小的下标和二分的减治思想!注意:有重复也不影响哦; 前k大的数字 可以有多个一样的呀!)

  2. 然后再利用这个数字进行一次快排的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问题的必会解法相关推荐

  1. 关于某日访问次数最多的IP的topK问题的三种解法

    题目描述 在july大神的博客中,看到这样两道题: 1. 海量日志数据,提取出某日访问百度次数最多的那个IP. 2. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复 ...

  2. TopK问题的三种解法

    TopK问题是指从n个数据中取前K个数据,在生活中的应用也有很多,如游戏中xxx的排行榜前10名等.在这篇博客中我将主要利用堆去解决TopK问题. 堆排序 首先我们需要建一个堆,然后我们再进行堆排序, ...

  3. 飘逸的python - 大数据TopK问题的quick select解法

    TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词. 方法一: 先排序,然后截取前k个数. 时间复杂度:O(n*logn)+O(k)=O(n*logn) ...

  4. 数据结构面试题(史上最全面试题,精心整理100家互联网企业,面试必过)

    最全面试题,精心整理100家互联网企业面经,祝你面试成功.面试必过(2023优化版)已发布在个人微信公众号[面向Offer学编程],优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结, ...

  5. 机器学习面试问题总结

    机器学习算法面试问题 美团AI算法 1. xgboost原理,怎么防过拟合 2. gbdt推导 3. boosting和bagging在不同情况下的选用 4. DBSCAN原理和算法伪代码,与kmea ...

  6. 《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明

    先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/artic ...

  7. 技术面常见问题(持续更新)

    一.数学基础: 1.微积分 1.SGD,Momentum,Adagard,Adam原理 SGD为随机梯度下降,每一次迭代计算数据集的mini-batch的梯度,然后对参数进行更新. Momentum参 ...

  8. 结构体在cuda核函数里面不能用吗_求职招聘 | 面试机器学习职位,这些知识点你都会了吗?...

    『运筹OR帷幄』转载 求职招聘栏目 来自于运筹帷幄的招聘板块.一方面,我们将为大家精心挑选和整理全球与运筹学.数据科学.机器学习.人工智能等领域相关的招聘职位.另一方面,我们也将翻译和转载国内外在该领 ...

  9. kmeans聚类算法_机器学习/算法校招面试考点汇总(附面试题和答案)【持续更新】_笔经面经...

    以下不作为机器学习/算法工程师的学习路径,只是汇总的校招机器学习/算法工程师面试考点(因为还有笔试考点,后面结合在一起给大家学习路径),后续会为大家更新10w+字数的机器学习/算法工程师校招面试题库, ...

最新文章

  1. python处理csv文件 sql_如何用python将csv文件写入sql数据库
  2. Asp.Net第一章入门之后台处理程序
  3. iOS获取自1970年毫秒数使用OC和swift两种语法,返回字符串
  4. 空间谱专题10:MUSIC算法
  5. 【十二省联考2019】皮配【分部dp】
  6. 为什么现在的年轻人越来越不愿意结婚、生子了?
  7. c语言爱心代码(c语言画爱心的代码)
  8. 在字节实习8个月后,成功转正
  9. 安装JDK与配置java环境变量
  10. 2017第48周日昨天休息
  11. AE学习日记之MapControl与PageLayoutControl图层变化同步
  12. 库存盘点遗失设备寻找中的个人收获
  13. Vue的生命周期是什么
  14. Newline —— CRLF、LF、CR回车和换行
  15. spidev0.0的正确打开方式
  16. c语言通过epoll来实现http协议的web服务器
  17. 修改win7开机登陆界面背景图片
  18. 获取32位整型变量中某一位的bit值
  19. 如何编译门禁APP,人脸识别功能运行
  20. 计算机有60进制吗,60进制介绍

热门文章

  1. easyExcel不同版本按照模板导出
  2. java中excel文件上传
  3. C++11_关键字_Deleted
  4. QT MV\MVC结构
  5. Android基础架构之MVP模型
  6. 获奖丨泽信荣获“第十届艾景奖”2020年度十佳景观设计奖
  7. BarManager控件介绍
  8. pythonzeros函数_zeros函数是什么意思?python中np.zeros中的参数是什么意思
  9. mysql共享锁和排它锁的使用
  10. 蓝桥杯单片机第十四届省赛题目和程序答案