谈从10亿个数中找出前10万个最大的

期的实验显示10亿个浮点数大概占据3G左右的空间,因此全部一次性读入内存目前在个人PC上是不太现实的。本次讨论不考虑内存等等,只考虑算法。

如果一次性比较排序,然后输出前面最大的10w个,那么众所周知,算法的时间复杂度不下于O(N lgN),此处的N为数的个数(10亿)。

如果用堆排序,由于堆排序像合并排序而不像插入排序,堆排序的运行时间为O(N lgN);又想插入排序而不像合并排序,堆排序是一种原地排序。因此堆排序具有相对小的运行时间和占用相对小的额外空间的优点。

再则,利用最小堆的性质,堆顶元素是整棵树中具有最小值的元素,因此,我们可以构建这样的一个最小堆:

step1:取前m个元素(例如m=10万),建立一个小顶堆

保持一个小顶堆得性质的步骤,运行时间为O(lgm);

建立一个小顶堆运行时间为m*O(lgm)=O(m lgm);

其实建立一个小顶堆实际运行时间为O(m);具体分析参考算法导论。

step2:顺序读取后续元素,直到结束

每次读取一个元素,如果该元素比堆顶元素小,直接丢弃

如果大于堆顶元素,则用该元素替换堆顶元素,然后保持最小堆性质

最坏情况是每次都需要替换掉堆顶的最小元素,因此需要维护堆的代价为(N-m)*O(lgm);

最后这个堆中的元素就是前最大的10W个。

时间复杂度为O(N lgm)。

转载于:https://www.cnblogs.com/watsonlong/archive/2011/03/24/1994452.html

谈从10亿个数中找出前10万个最大的相关推荐

  1. 在10亿个数中找出前1000个最大的

    在10亿个数中找出前1000个最大的 假设现在有一个文件,里面存放了10亿个整数,需要找出前1000个最大的. 方法: 1.普通排序,部分排序:几乎不可取. 2.分治法:随机选一个数t,然后对整个数组 ...

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

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

  3. 10亿个数中找出最大的10000个数

    转载自  海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅 ...

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

    原博链接: https://blog.csdn.net/cbjcry/article/details/84917432 问题引入:10亿个数中找出最大的10000个数(top K问题) top K问题 ...

  5. 【面试现场】如何在10亿数中找出前1000大的数

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已经挂了两家,今天小史去了BAT中的最后一家面试了. 简单的 ...

  6. 如何在 10 亿数中找出前 1000 大的数?

    作者 | channingbreeze 责编 | 胡巍巍 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已 ...

  7. 从十亿个数中找出前1000个最大的数的算法

    10亿个数中找出1000个最大的数的算法思路: 1,先拿出前1000个数字,并排序,找出最小值为 minValue .    2,  然后再依次拿出1000个数字,找出最大值为 tempMaxValu ...

  8. 10亿个数中找出最大的10000个数之top K问题

    方法一.先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10 ...

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

    top K问题 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题.例如,在搜索引擎中,统计搜索最热 ...

最新文章

  1. 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)
  2. 【Python-ML】最小二乘法
  3. 2.Functions and Getting Help
  4. 专访《程序员的三门课》李伟山:从程序员到技术总监的修炼秘籍!
  5. linux如何结束音乐是什么函数,与音乐有关的linux命令
  6. 金山云和金山办公均成功上市 雷军揭秘背后原因
  7. sqlplus 设置显示格式
  8. Spring的单例模式底层实现
  9. Autodesk 首届中国开发者训练营将开始报名,5月24日前报名6折优惠!
  10. Ubuntu上无法登录网页版本微信的解决方案
  11. php 获取月份的周数,PHP获取当前月份的周数只能使用php
  12. 经典语录 - 人生十悟
  13. 连缀介绍和简单库对象
  14. swing(二十一)
  15. js当前页面打开小窗口 window.open
  16. Java实验01 Java编程基础(猜数字游戏、随机点名器)
  17. 《JAVA程序性能优化》总结
  18. PS-第三天-钢笔抠图及商业案例
  19. 股票软件定制将成为券商下一个核心竞争力
  20. 2419. Grass Planting

热门文章

  1. Visual C# 2010 实现资源管理器
  2. ASP.NET经典How to do文章汇总
  3. llinux基本操作
  4. TCP/IP和OSI4层、7层协议介绍
  5. 高频焊台源码,改进版V2
  6. 【Mysql 学习路线图】
  7. CSS之未知高度多行文本垂直居中
  8. 在水晶报表中实现任意选择指定字段显示-模板及C#升级版
  9. 计算时间差的Oracle函数
  10. javascript打印