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

转载于:https://www.cnblogs.com/DarrenChan/p/8796749.html

海量数据中找top K专题相关推荐

  1. 找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)

    在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题. 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到 ...

  2. 【算法】快速选择算法 ( 数组中找第 K 大元素 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  3. 【LeetCode】快排-无序整数数组中找第k大的数(或者最小的k个数)

    一个有代表性的题目:无序整数数组中找第k大的数,对快排进行优化. 这里先不说这个题目怎么解答,先仔细回顾回顾快排,掰开了揉碎了理解理解这个排序算法:时间复杂度.空间复杂度:什么情况下是复杂度最高的情况 ...

  4. 从2个有序数组中找第k小那个数

    系列文章目录 提示:AC==accepted,即LeetCode上提交代码通过,我刷题的代码用的是java,但是C++一个道理,算法思想一样,而且c++和java非常类似,python需要自己写,但是 ...

  5. 无序数组中找第K大的数

    类快排算法 leetcode215 由于只要求找出第k大的数,没必要将数组中所有值都排序. 典型解法:快速排序分组. 在数组中找到第k大的元素 取基准元素,将元素分为两个集合,一个集合元素比基准小,另 ...

  6. 从海量数据中找出中位数

    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...

  7. 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 ...

  8. 两个排序数组中找第k大的数

    一.题目描述 给定两个已经排序好的数组,找到两者所有元素中第k大的元素 二.解法分析 解法一:参照归并排序 将两个有序数组变成一个有序数组:merge两个数组,然后求第k大的数,时间复杂度O(m+n) ...

  9. leetcode 703. 数据流中的第K大元素 最小堆解法 c语言

    如题: 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含 ...

最新文章

  1. 一文搞懂faiss计算
  2. 游戏运维的最佳实践:搜狐畅游自动化运维之旅
  3. 字符串比较--小问题大智慧
  4. python 根据字典中值的大小对项进行排序
  5. Linux生产环境CPU占用过高排查步骤
  6. c语言预处理指令之 ##
  7. 外挂学习之路(5)--- 写测试call的注意事项
  8. Linux C高级编程——文件操作之系统调用
  9. 12如何隐藏dock栏_ iOS 13 隐藏 Dock栏,一张神奇壁纸就可以
  10. 考虑题4所示的日志记录_基于Log4Net实现日志信息双向存储
  11. macos 下 vmware fusion 安装 vmware tools
  12. 简单粗暴理解【阿姆达尔定律】
  13. 高数_第6章无穷级数__绝对收敛_条件收敛
  14. 背后的力量 | 升级电子病历基础架构 华云数据助力华中科技大学同济医学院附属协和医院打造就医新模式
  15. K线形态识别_双飞乌鸦
  16. Mac 上 VMware 安装 win7 虚拟机如何添加磁盘
  17. three后期处理与多通道渲染
  18. 莫名其妙的jsp错,引号内不能在使用引号
  19. 网页多个OnLoad事件处理
  20. UE4引用第三方库Lib以及dll

热门文章

  1. golang 文件md5_golang 计算大文件md5
  2. 知识图谱组队学习Task03——图数据库导入数据
  3. 2018抖音数据研究报告完整版,你喜欢的网红画像到底是怎样?
  4. python list函数使用总结_python——list总结
  5. matlab gpu 编程 macOS,MATLAB GPU编程基础
  6. jedis操作set_Jedis的学习
  7. 山东大学-WIZnet网络控制实验室揭牌仪式成功举行
  8. Fixjs——显示基类DisplayObject
  9. 你的ERP项目实施为啥质量高不了?
  10. extjs计算两个DateField所间隔的月份(天数)