Pro1:寻找前K大数

方法1:K小根堆  后面的值若大于当前根,则替换之,并调整堆

大部分人都推荐的做法是用堆,小根堆。下面具体解释下:

如果K = 1,那么什么都不需要做,直接遍历一遍,时间复杂度O(N)。

下面讨论K 比较大的情况,比如1万。

建立一个小根堆,则根是当前最小的第K个数。然后读入N-K个数,每次读入一个数就与当前的根进行比较,如果大于当前根,则替换之,并调整堆。如果小,则读入下一个。

时间复杂度O(N*logK)。

方法2:利用快排分区思想:

本题还有一个时间复杂度比较好的做法。在编程之美上提到过该算法。

首先找到最大的第K个数。这个时间复杂度可以做到O(N),具体做法如下(利用快排分区思想):

从N个数中随机选择一个数,扫描一遍,比n大的放在右边,r个元素,比n小的放左边,l个元素

如果:  a:l = K-1   返回n

b:l > K-1 在l个元素中继续执行前面的操作。

c:l < K-1  在r个元素中继续执行前面的操作。

b,c每次只需执行一项,因此平均复杂度大概为:O(n+n/2+n/4...)=O(2n)=O(n)

Pro2: K路合并求Top-K

20路已经有序,20路合并  求Top500

有 20 个数组,每个数组有 500 个元素,并且是有序排列好的,现在在这 20*500个数中找出排名前 500 的数。

答:

从20个数组中各取一个数,并记录每个数的来源数组,建立一个含20个元素的大根堆。此时堆顶就是最大的数,取出堆顶元素,并从堆顶元素的来源数组中取下一个数加入堆,再取最大值,一直这样进行500次即可。

Pro3: K路合并排序

请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法,此处n为所有输入链表中元素的总数。

算法思想:

1. 从k个链表中取出每个链表的第一个元素,组成一个大小为k的数组arr,然后将数组arr转换为最小堆,那么arr[0]就为最小元素了;

2. 取出arr[0],将其放到新的链表中,然后将arr[0]元素在原链表中的下一个元素补到arr[0]处,即arr[0].next,如果 arr[0].next为空,即它所在的链表的元素已经取完了,那么将堆的最后一个元素补到arr[0]处,堆的大小自动减1,循环即可。

http://www.programlife.net/stl-priority-queue.html

Pro4: 整体有序局部无序问题

一个有100亿个元素的整型数组,它的元素是有序的,现在把它分成若干段,每段不超过20个元素,每段的元素个数不等,现在在每段内将这些元素的顺序打乱,然后重新将这100亿个元素的数组排序,请问时间复杂度最小的算法是什么?并给出时间复杂度。

http://bbs.csdn.net/topics/390252481

http://blog.csdn.net/burningsheep/article/details/8104493

分析:

如果每段长度相等,则可以考虑采用上面的K路归并,但此处长度不相等,需另行考虑其它方法。

解:(直接插入排序)

假设第1到第5n个数已经有序为sort(5n),那么我们要将5n+1到5n+5这5个数据添加到已排序的数组中,只需要进行插入排序,将这5个数添加进即可。由于分段的长度不超过5,所以第5n+1个数在插入的时候,最多只需要搜索到第5n-4个数就可以了,比较个数不会超过5次。又因为5n+1到5n+5是已经排好序的,所以,后面的数比较次数也不会超过5次(最多比较到前一个插入的位置)。因此,每加入5个数到已排序数组中,时间复杂度是O(5*5),

假设长度为N,每段长不超过K。则每段插入的时间复杂度即为O(K*K)。

而对于以段为单位插入的操作,需要进行N/K次,所以,总的时间复杂度是O(K*K)*O(N/K)=O(NK)

Pro5:100亿个数,求最大的1万个数,并说出算法的时间复杂度

建一个堆,先把最开始的1万个数放进去。以后每进一个,都把最小的赶出来。

上述算法的可选实现工具:自己建立数组进行堆排序、使用优先队列priority_queue、使用集合set multiset
在最大堆中,根结点的值总是大于它的子树中任意结点的值。于是我们每次可以在O(1)得到已有的k个数字中的最大值18,但需要O(logk)时间完成删除以及插入操作。
队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部。priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级。这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。
在STL中set和multiset都是基于红黑树实现的,查找、删除和插入操作都只需要O(logk)。

Top-K问题与多路归并排序相关推荐

  1. 海量数据处理的 Top K相关问题

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 Top-k的最小堆解决方法 问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数.(称作Top k或者Top ...

  2. 鱼塘钓鱼 优先队列 多路归并排序 贪心

    鱼塘钓鱼 优先队列 多路归并排序 贪心 优先队列介绍 贪心思想:不会回头 解题思想:枚举0-N-1目的地鱼塘k, 如图 从上到下 选t(钓鱼的时间)个数,使和最大 #include<iostre ...

  3. 海量数据中找top K专题

    1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...

  4. 1亿个数中找出最大的100个数(top K问题)

    如何在1亿个数中找出最大的100个数(top K问题) ​ 最容易想到的方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序.但是在32位的 ...

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

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

  6. 堆实战(动态数据流求top k大元素,动态数据流求中位数)

    动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可当来的元素(newCome)> 堆顶元素(smallTo ...

  7. 多路归并排序_1600W整数排序多路归并

    Merge Sort 问题描述 Go 语言实现一个16M的整数(int64)多路归并的数组排序 思路 将待排序数组分成多个组,利用多个goroutine实现各个组的并行排序:然后通过Heap(最小堆) ...

  8. sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding...

    1 概述 这是基于开源的sphinx全文检索引擎的架构代码分析,本篇主要描述index索引服务的分析.当前分析的版本 sphinx-2.0.4 2 index 功能 3 文件表 4 索引文件结构 4. ...

  9. Top K算法问题的实现

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

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

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

最新文章

  1. 模糊综合评价法用什么软件实现_基于建管养一体化模式的钢桥面铺装方案综合评价分析...
  2. 四则运算个人项目反思总结
  3. Hbase hbck2下载编译和基本使用
  4. dell的1501和640m,买哪个好呢?
  5. 给vs2012轻松换肤
  6. NHibernate获取实体配置信息(表名,列名等等)
  7. 使用Java第2部分查询DynamoDB项
  8. html5 上传 原理,浅谈使用HTML5的FormData上传文件原理!!!
  9. [MVC.NET] Asp.Net MVC3 简单入门第一季
  10. 【白皮书分享】工业互联网人才白皮书(2020).pdf(附下载链接)
  11. 数据流分析之WorkList Algorithm
  12. 链路状态路由协议-OSPF
  13. dtools: error while loading shared libraries: libicui18n.so.55: cannot open shared object file
  14. windows2003下如何关闭默认共享
  15. Mybatis批量新增
  16. python excel 单元格换行_python excel单元格如何换行
  17. Excel 2010 SQL应用096 聚合函数之标准偏差及标准差
  18. 【Baidu Apollo】3 定位
  19. 解决PostgreSQL远程访问报错could not connect to server:Connection refused (0x0000274D/10061)
  20. AES加密解密SHA1、SHA加密MD5加密

热门文章

  1. mysql 枚举_是否推荐使用MySQL的enum类型?
  2. 简单的docker-compose编写介绍(包含 nginx+tomcat 实例演示)
  3. 中如何调取api_API(接口)是什么
  4. m3u8地址_「波波带你手动提取网页视频」04讲 Network和Elements提取m3u8链接
  5. python绘制三维曲线图_Python基于matplotlib实现绘制三维图形功能示例
  6. 如何加减单元格指定数字_Word如何做加减乘除?你学会这个公式就会了
  7. python random函数sample_Python random.seed() random.sample()函数使用
  8. oracle错误代码12516,ORA-12516错误解决
  9. mysql导入csvnull,MySQL Workbench从CSV导入NULL
  10. oracle 11g 忘记了sys,system,scott密码