top-K 算法总结
问题描述:有 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 算法总结相关推荐
- Top K算法问题的实现
前奏 在上一篇文章,程序员面试题狂想曲:第三章.寻找最小的k个数中,后来为了论证类似快速排序中partition的方法在最坏情况下,能在O(N)的时间复杂度内找到最小的k个数,而前前后后upd ...
- 程序员编程艺术:第三章续、Top K算法问题的实现
程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha. 致谢:微软100题实现组,狂想曲创作组. 时间:2011年05月08日 ...
- 海量数据处理的 Top K算法(问题) 小顶堆实现
问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数.(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据:(2)只要前K个,对整个输入数据的保存和排序是相 ...
- 典型的Top K算法_找出一个数组里面前K个最大数
原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...
- 10亿个数中找出最大的10000个数(top K问题)
原博链接: https://blog.csdn.net/cbjcry/article/details/84917432 问题引入:10亿个数中找出最大的10000个数(top K问题) top K问题 ...
- Top k问题(线性时间选择算法)
问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供 ...
- Top K 问题的最优解 - 快速选择算法(图解详细教程)
文章目录 Leetcode 215. Kth Largest Element in an Array 1.1:快速选择算法流程 1.2:注意事项 1.3:python实现 Leetcode 973. ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K)
海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 版权声明:本文为博主原创文章,未经博主允许不得转载 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望 ...
- 海量数据处理:如何从10亿个数中,找出最大的10000个数?(top K问题)
一.问题 有 10 亿个不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10 万个数字? 这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的) ...
- 找出无序数组中最小的k个数(top k问题)
2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...
最新文章
- PHP相关关系及定义
- python折线图样式_Python金融应用之图表制作(二)
- Open Infrastructure Summit 2019,炼就成功开源范示;阿里云居亚太市场第一;高通将获45亿美元和解金...
- MATLAB中disp的用法
- Python的文件锁使用
- MySQL中向下查询_mysql
- 【windows】python打包后多进程引发的无限循环启动
- LeetCode1436 旅行终点站
- 初级程序员晋升中级程序员,只差这7个技能
- 去哪里下载SSL证书?
- CRP原理的简单例子
- 【论文翻译】Learning from Few Samples: A Survey 小样本学习综述
- HDU6194(后缀数组)
- SDUT-2245 小学数学
- 几个常见的js插件安装配置
- 分享丨一篇文读懂19款数据分析软件,解救选择困难症!
- ML机器学习算法(一): 基于逻辑回归的分类预测
- python计算股票波动率_如何统计投资品种波动率(python)?
- 计算机作业微波炉工作的原理,微波炉的工作原理和原理图解析
- linux系统硬盘ghost吗,将linux硬盘ghost到另一颗去