海量数据中找top K专题
1. 10亿个数中找出最大的1000个数
这种题目就是分治+堆排序。
为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存限制即可。什么,如何分?Hash(num)% numOfFiles。
为啥堆排序?首先堆排序是一种选择排序,比一般的选择排序时间复杂度要低,额外的空间复杂度都是O(1)。因为我只要在每一份中拿出最大的1000个即可,这里用大顶堆还是小顶堆呢?
开始我觉得是大顶堆,我们不妨举个例子:假设10亿个数,分成若干组,每组假设1000000,我们所要做的,就是在这1000000的个数中,找出前1000。如果采用大顶堆,意味着我们需要构建1000000节点的一个大树,然后调整找出前1000,就是根嘛。但是你不觉得这个树太大了吗?而要是小顶堆呢?我只要构建一个1000节点的树即可,这样我从剩余元素中拿出来和根比较,如果比根小直接舍弃,如果比根大,替换根的位置,然后重新调整堆,这样最后这1000个节点就是最大的。
最后把每一份中的1000个最大的数合在一起找最终结果就够了(可以继续用堆排序查找),有没有觉得这个就是mapReduce的Shuffle的思想,如果不了解建议看一下我的另一篇博客:http://www.cnblogs.com/DarrenChan/p/6477088.html,不同的是Shuffle中合并排序采用的是归并排序。

堆排序讲解,请参考:https://www.cnblogs.com/chengxiao/p/6129630.html
2. 10亿个数中找出出现频率最高的1000个数
这道题和上道题本质相同,通常比较好的方案是分治+Trie树/hash+堆排序,即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树或者Hash统计每个数字的词频,之后用堆排序求出每个数据集中出现频率最高的前K个数,最后再合并求最终的top K。
3. 10亿个数中找出某个数
我刚开始的想法是分治+排序,然后每个二分查找,可是感觉还是复杂度蛮高的。
后来突然想到MySQL数据库中的索引,就想成给主键建立索引,然后查找主键不就好了吗?
参考InnoDB数据库索引的思路,建立一个主键索引,这里不用建立辅助索引了,因为你只有主键,哈哈~然后索引通过B+树进行存储,为什么采用B+树,主要为了减少IO次数,为啥不用B-树(B树),额,定义上好像说了,请看:
B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定;我们先看看两者的区别:
(1)B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每个节点所能保存的关键字大大增加;
(2)B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的关键字从小到大链接;
(3)B+树的根节点关键字数量和其子节点个数相等;
(4)B+的非叶子节点只进行数据索引,不会存实际的关键字记录的指针,所有数据地址必须要到叶子节点才能获取到,所以每次数据查询的次数都一样;

特点:
在B树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所有指关键字指针都存在叶子节点,所以每次查找的次数都相同所以查询速度更稳定;
具体参见:https://zhuanlan.zhihu.com/p/27700617
这样我们就可以通过索引在叶子节点查询到我们的数字了。
参考:https://blog.csdn.net/zyq522376829/article/details/47686867
海量数据中找top K专题的更多相关文章
- 海量数据中找出前k大数(topk问题)
海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...
- 17082 两个有序数序列中找第k小
17082 两个有序数序列中找第k小 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 已知两个已经排好序(非减 ...
- 17082 两个有序数序列中找第k小(优先做)
17082 两个有序数序列中找第k小(优先做) 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description 已 ...
- 17082 两个有序数序列中找第k小(优先做) O(logn)
17082 两个有序数序列中找第k小(优先做) 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description 已 ...
- pig中查询top k,返回每个hour和ad_network_id下最大两个记录(SUBSTRING,order,COUNT_STAR,limit)
pig里面是有TOP函数,不知道为什么用不了.有时间要去看看pig源码了. SET job.name 'top_k'; SET job.priority HIGH; --REGISTER piggyb ...
- 基于visual Studio2013解决面试题之0302链表中找倒数k项节点
题目
- 解决面试问题中的top k问题 Leetcode
https://leetcode.com/problems/kth-largest-element-in-an-array/ 使用堆,堆插入一个数据是logk,删除一个数据是logk,复杂度为logk ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...
- 如何解决海量数据的Top K问题
1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门 ...
随机推荐
- 利用ApiPost接口调试与文档生成工具,提升前、后端工作效率
什么是ApiPost? 场景1: 对于我们后端程序员,常常会写一些接口(APIs),但是在前端尚未调用之前,我们必须先自己测试下这个接口是不是正确返回了预定结果.对于一个GET请求的接口还好,我们可以 ...
- 事物注解方式: @Transactional
当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean implements TestService { ...
- git使用经验for windows
一.本地同步fork的最新版本 二.git命令 一.本地同步fork的最新版本 ①打开Git CMD工具,进入git的主目录 ②使用 git remote -v 查看fork的远程仓库地址 origi ...
- python-线程的暂停, 恢复, 退出
我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦s ...
- C# 使用 iTextSharp 将 PDF 转换成 TXT 文本
var pdfReader = new PdfReader("xxx.pdf"); StreamWriter output = new StreamWriter(new FileS ...
- 【11.8校内测试】【倒计时2天】【状压DP】【随机化?/暴力小模拟】
Solution 数据范围疯狂暗示状压,可是一开始发现状态特别难受. 将每一层的奇偶性状压,预处理所有状态的奇偶性.每一层的输入代表的其实可以是下一层某个点可以被从这一层哪些点转移到. 所以枚举每个状 ...
- Residual Networks
Andrew Ng deeplearning courese-4:Convolutional Neural Network Convolutional Neural Networks: Step by ...
- MAC常用软件推荐
SQL建模 http://dbwrench.com/download/install/mac_install.shtml 参考https://github.com/helantao/macOS/blo ...
- 手机 https 抓包---Charles篇
原文出处: Lu尼玛的想疗院 作为一名现代前端,除了要掌握html,css,js 以及一系列乱七八糟框架之外,还得懂得如何抓包改包.当然,常规的网站或者自主开发的我们往往使用 chrome或者 fir ...
- WIN10平板 如何关闭自动更新
运行,services.msc打开组策略 找到Windows Update,设置启动类型为禁用即可