海量数据中的TOPK问题小结
1.利用堆找出最大的K个数
首先,先理解下用堆找出最大的K个数的常用解法,例如问题是“从M(M <= 10000)个数中找出最大的K个数”
(1)利用最大堆
建立一个N=M大小的大顶堆,然后输出根节点之后,将根节点删除,然后再将剩余的元素调整成大顶堆;依次重复K次这个过程,最终就找出了K个最大的数。这实质上就是堆排序的过程。这种方法的时间复杂度为O(K *logM)
(2)利用最小堆
这是最常用的一种方式,首先建立一个N=K大小的小顶堆,这K个元素可以为M中元素中的任意K个;我们假设这K个元素就是最大的K个元素(其中根节点是这K个元素中最小的元素);那么对于剩下的M-K个元素,我们逐个与根节点进行对比,
如果当前元素大于根节点的元素的话,就将当前的元素与根节点的元素进行交换,然后将堆再次进行进行调整成最小堆,重复这个过程,直到比较完剩下的M-K个元素;那么最终的小顶堆对应的K个数,必然是M个数中的最大的K个数。这种方法的
时间复杂度为O(M*logK);并且方法2相对方法1而言,所需要的内存空间更小了,方法1建立的堆需要M个元素对应的内存空间,而方法2建立的堆只需要K个元素对应的内存空间,所以在对内存空间有严格要求的情况下,采用方法2会更加好一些。
2.海量数据中找出最大的K个数
对于1而言,M这个指不能很大;如果M很大的话(比如M = 40亿),就不能直接使用排序来找了。对于这种情况,一般是利用“hash映射+堆”的过程,这里的堆是指的方法2,具体如下:
将40亿个数分成若干小的部分(分成多少部分要看题目对内从空间大小的限制),一般是利用哈希函数$h(x) = x% N$,其中N为分成的部分数;然后对于每个小的部分,如果内存可以一次性读取的话,则利用堆采用方法2,选取每个小部分数据中的TOPK个元素,一共
N*K个元素,然后继续利用堆,采用方法2从这N*K个元素种找出最大的K个元素。
3.找出100亿个URL中重复的URL
(1)对于这类问题,通常采用的的算法思想是“hash映射+哈希表”;大体而言,将100亿个URL利用哈希函数分成N个部分,每个部分用哈希表进行统计次数,最终找到所有重复的URL。
(2)利用字典树。
4.找出20亿个数中出现次数最多的数
解决这类问题的想和3中的法(1)类似。
5.找出40亿个非负整数中出现0次、1次...N次的数
一般找出非负整数中的出现多少次的数,都是利用BItMap
此处只是粗略的总结下,更详细的总结可参考左神的《程序员代码面试指南--IT名企算法与数据结构题目最优解》和July的https://blog.csdn.net/v_july_v/article/details/7382693
海量数据中的TOPK问题小结的更多相关文章
- 海量数据中找出前k大数(topk问题)
海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...
- 从海量数据中寻找出topK的最优算法代码
package findMinNumIncludedTopN;/** * 小顶堆 * @author TongXueQiang * @date 2016/03/09 * @since JDK 1.8 ...
- Delphi中ClientDataSet的用法小结
Delphi中ClientDataSet的用法小结 TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件.该控件封装了对数据进 ...
- EntityFramework中几种操作小结
目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. 列中加入RowVersion时间戳 public class Product ...
- 关于 C# 中接口的一些小结
< 关于 C# 中“接口”的一些小结 > 对于 C# 这样的不支持多重继承的语言,很好的体现的层次性,但是有些时候多重继承的确有一些用武之地. 比如,在 Stream 类 . 图形设备 ...
- 原创:从海量数据中查找出前k个最小或最大值的算法(java)
现在有这么一道题目:要求从多个的数据中查找出前K个最小或最大值 分析:有多种方案可以实现.一.最容易想到的是先对数据快速排序,然后输出前k个数字. 二.先定义容量为k的数组,从源数据中取出前k个填 ...
- C#中SqlDataAdapter的使用小结---转载
C#中SqlDataAdapter的使用小结 转载 叁木-Neil 最后发布于2018-06-07 21:29:39 阅读数 8275 收藏 展开 SqlDataAdapter对象 一.特点介绍1.表 ...
- windows中抓取hash小结(下)
书接上回,windows中抓取hash小结(上) 指路链接 https://www.cnblogs.com/lcxblogs/p/13957899.html 继续 0x03 从ntds.dit中抓取 ...
- windows中抓取hash小结(上)
我上篇随笔说到了内网中横向移动的几种姿势,横向移动的前提是获取了具有某些权限的用户的明文密码或hash,正愁不知道写点啥,那就来整理一下这个"前提"-----如何在windows系 ...
随机推荐
- [转载] Fiddler为所欲为第三篇 封包逆向必备知识[三]
导语: 小A同学:会抓包有什么好学习的,不就用一个工具设置个wifi代{过}{滤}理就OK了嘛,还不是很多做不了.不如学习安卓逆向.didi科学家:不好意思,抓包可以为所欲为. 其实学习抓包,完完全全 ...
- 洛谷p1181 数列分段section I
#include<iostream> #include<vector> #include<algorithm> using namespace std; int M ...
- Delphi编程之爬取贴吧多页帖子图片
接着上一篇文章说一下我们如何爬取多页帖子的图片. 第一步,还是随便找个贴吧,这次我们就找图片相对较少的射雕英雄传吧. 把页面拉到最底下,在页码区域单击右键,选择检查. 在这里我们看到了页码的代码区域, ...
- DAY1_PYTHON基础作业
''' print("1.使用while循环输入 1 2 3 4 5 6 8 9 10") count = 1 while count < 11: print(count) ...
- Python学习第六课
Python学习第六课 课前回顾 列表 创建 通过 [] :写在[]里,元素之间用逗号隔开 对应操作: 查 增 append insert 改(重新赋值) 删除(remove del pop(删除后会 ...
- Request对象和Response对象 JsonResponse对象 和 Django shortcut functions 和QueryDict对象
request request属性 属性: django将请求报文中的请求行.头部信息.内容主体封装成 HttpRequest 类中的属性. 除了特殊说明的之外,其他均为只读的. ''' 0.Http ...
- java后台常见问题
Java后台面试 常见问题 Nginx负载均衡 轮询.轮询是默认的,每一个请求按顺序逐一分配到不同的后端服务器,如果后端服务器down掉了,则能自动剔除 ip_hash.个请求按访问IP的hash结果 ...
- Linux 环境下安装Redis的步骤
#进入usr/local目录cd /usr/local#下载1.wget http://download.redis.io/releases/redis-4.0.10.tar.gz#解压2.tar x ...
- Linux命令基础2-ls命令
本文介绍的是linux中的ls命令,ls的单词是list files的缩写,意思的列出目录文件. 首先我们在admin用户的当前路径,新建一个test的文件夹,为了方便本文操作和介绍,创建了不同文件类 ...
- 新式类单例模式之 __new__()
单例模式: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类中有一个静态属性__instance,默认为none,重构__new__()方法,判断__instance是否为空,若为 ...