问题描述:有 N (N>1000000)个数,求出其中的前K个最小的数(又被称作topK问题)

1 最基本思路

将N个数进行完全排序,从中选出排在前K的元素即为所求。有了这个思路,我们可以选择相应的排序算法进行处理,目前来看快速排序,堆排序和归并排序都能达到**O(NlogN)**的时间复杂度。

2 优先队列

可以采用数据池的思想,选择其中前K个数作为数据池,后面的N-K个数与这K个数进行比较,若小于其中的任何一个数,则进行替换。这种思路的算法复杂度是O(N*K).
剩余的N-K个数与前面K个数比较的时候,是顺序比较的,算法复杂度是K。

3 大根堆

大根堆维护一个大小为K的数组,目前该大根堆中的元素是排名前K的数,其中根是最大的数。此后,每次从原数组中取一个元素与根进行比较,如小于根的元素,则将根元素替换并进行堆调整(下沉),即保证大根堆中的元素仍然是排名前K的数,且根元素仍然最大;否则不予处理,取下一个数组元素继续该过程。该算法的时间复杂度是O(N*logK),一般来说企业中都采用该策略处理topK问题,因为该算法不需要一次将原数组中的内容全部加载到内存中,而这正是海量数据处理必然会面临的一个关卡。

4 快速排序

利用快速排序的分划函数找到分划位置K,则其前面的内容即为所求。该算法是一种非常有效的处理方式,时间复杂度是O(N)(证明可以参考算法导论书籍)。对于能一次加载到内存中的数组,该策略非常优秀。

代码实现:基于快排和堆排的TopK算法

原文链接:https://www.jianshu.com/p/5b8f00d6a9d7

5 “冒泡排序”获取TopK

(1)可以避免对所有数据进行排序,只排序部分;
(2)冒泡排序是每一轮排序都会获得一个最大值,则K轮排序即可获得TopK。

6 局部淘汰法 – 借助数据结构"堆"获取TopK

(1)堆:分为大顶堆(堆顶元素大于其他所有元素)和小顶堆(堆顶其他元素小于所有其他元素)。
(2)我们使用小顶堆来实现。
(3)取出K个元素放在另外的数组中,对这K个元素进行建堆。
(4)然后循环从K下标位置遍历数据,只要元素大于堆顶,我们就将堆顶赋值为该元素,然后重新调整为小顶堆。
(5)循环完毕后,K个元素的堆数组就是我们所需要的TopK。

7 分治法 – 借助”快速排序“获取TopK

(1)比如有10亿的数据,找处Top1000,我们先将10亿的数据分成1000份,每份100万条数据。
(2)在每一份中找出对应的Top 1000,整合到一个数组中,得到100万条数据,这样过滤掉了999%%的数据。
(3)使用快速排序对这100万条数据进行”一轮“排序,一轮排序之后指针的位置指向的数字假设为S,会将数组分为两部分,一部分大于S记作Si,一部分小于S记作Sj。
(4)如果Si元素个数大于1000,我们对Si数组再进行一轮排序,再次将Si分成了Si和Sj。如果Si的元素小于1000,则我们需要在Sj中获取1000-count(Si)个元素的,也就是对Sj进行排序
(5)如此递归下去即可获得Top-K。

原文链接:http://www.mianshigee.com/question/12518zap

top-K 算法总结相关推荐

  1. Top K算法问题的实现

    前奏     在上一篇文章,程序员面试题狂想曲:第三章.寻找最小的k个数中,后来为了论证类似快速排序中partition的方法在最坏情况下,能在O(N)的时间复杂度内找到最小的k个数,而前前后后upd ...

  2. 程序员编程艺术:第三章续、Top K算法问题的实现

    程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha.     致谢:微软100题实现组,狂想曲创作组.     时间:2011年05月08日    ...

  3. 海量数据处理的 Top K算法(问题) 小顶堆实现

    问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数.(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据:(2)只要前K个,对整个输入数据的保存和排序是相 ...

  4. 典型的Top K算法_找出一个数组里面前K个最大数

    原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...

  5. 10亿个数中找出最大的10000个数(top K问题)

    原博链接: https://blog.csdn.net/cbjcry/article/details/84917432 问题引入:10亿个数中找出最大的10000个数(top K问题) top K问题 ...

  6. Top k问题(线性时间选择算法)

    问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供 ...

  7. Top K 问题的最优解 - 快速选择算法(图解详细教程)

    文章目录 Leetcode 215. Kth Largest Element in an Array 1.1:快速选择算法流程 1.2:注意事项 1.3:python实现 Leetcode 973. ...

  8. 海量数据处理 - 10亿个数中找出最大的10000个数(top K)

    海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 版权声明:本文为博主原创文章,未经博主允许不得转载 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望 ...

  9. 海量数据处理:如何从10亿个数中,找出最大的10000个数?(top K问题)

    一.问题 有 10 亿个不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10 万个数字? 这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的) ...

  10. 找出无序数组中最小的k个数(top k问题)

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...

最新文章

  1. PHP相关关系及定义
  2. python折线图样式_Python金融应用之图表制作(二)
  3. Open Infrastructure Summit 2019,炼就成功开源范示;阿里云居亚太市场第一;高通将获45亿美元和解金...
  4. MATLAB中disp的用法
  5. Python的文件锁使用
  6. MySQL中向下查询_mysql
  7. 【windows】python打包后多进程引发的无限循环启动
  8. LeetCode1436 旅行终点站
  9. 初级程序员晋升中级程序员,只差这7个技能
  10. 去哪里下载SSL证书?
  11. CRP原理的简单例子
  12. 【论文翻译】Learning from Few Samples: A Survey 小样本学习综述
  13. HDU6194(后缀数组)
  14. SDUT-2245 小学数学
  15. 几个常见的js插件安装配置
  16. 分享丨一篇文读懂19款数据分析软件,解救选择困难症!
  17. ML机器学习算法(一): 基于逻辑回归的分类预测
  18. python计算股票波动率_如何统计投资品种波动率(python)?
  19. 计算机作业微波炉工作的原理,微波炉的工作原理和原理图解析
  20. linux系统硬盘ghost吗,将linux硬盘ghost到另一颗去

热门文章

  1. 基于matlab simulink (Simple 6-Pulse HVDC Transmission System)简单六脉冲高压直流输电系统
  2. 【通知】《生成对抗网络GAN原理与实践》代码开源,勘误汇总!
  3. 【软件卸载-ASM(IsaHelper)入网小助手卸载】
  4. 日本东京的穷人是怎样的生活水平?
  5. vmdk是什么文件?
  6. 聊聊获取屏幕高度这件事
  7. 圣诞海报设计背景,开始准备
  8. html中超链接使用_HTML超链接代码
  9. 【PHP工具类】SESSION
  10. Cesium学习五:使用entity绘制cylinder