前两天同学面试遇到的一道题,大数据怎么找出中位数。大数据 --> 所有数据不能一下子读入内存

中位数 --> 需要遍历所有数据

1. 题目

在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数;内存限制为512M;请写出算法设计思路;

2. 基本知识b --> bit 比特,位(二进制中的位)

B --> Byte 字节,1个字节=8位,1B=8bit

K --> KB 千字节,1KB = 1024B

M --> MB 兆字节,1M = 1024KB = 1024*1024B

G --> GB 1GB = 1024MB

问题分析:

100亿个32位整数,那么占用内存为:100亿*32 b = 100亿*32/8 B = 100亿*32/8/1024 KB = 100亿*32/8/1024/1024 MB = 38146.9727 MB > 512M

所以肯定不能一次全部载入内存。

那么512M可以装多少个32位整数呢?512M=512*1024K=512*1024*1024B=512*1024*1024*8b=4294967296b

可存储32位整数:4294967296b/32b=134217728个,是1亿多个。

3. 设计思路

中位数需要遍历数据才能找出来,512M是我们可用的内存限制,每次只能载入1亿多个数据,100亿个数据,我们可以分成100次进行载入遍历。

那么遍历的时候我们需要记录哪些信息呢,因为要求中位数,我们可以考虑将数据划分区间,计算每个区间我们的数据落进去的数目,就可以大致知道数据分布了。

所以整体的数据区间是多少呢?一个有符号的32位整数,他的取值范围是:

,总共有4294967296个整数值,我们把它划成100000组,那么每组的数据是43000个,最后一组少点。

所以第一个区间

的取值范围是

,第二个区间

的取值范围是

,以此类推。

我们分一百次载入数据,每次载入1亿个,遍历这一亿个数据,数据落入哪个区间,则那个区间的统计值+1。100次载入完成之后,我们便得到了每个区间的统计值,我们用

来代表数据落入

区间的统计值。那么肯定有

现在我们需要寻找中位数落入哪个区间,100亿个数据的话,中位数应该等于第50亿大和第50亿+1大的数据的平均。所以我们需要知道这两个数,落在哪个区间了。

我们从

开始累加,一直累加到

使得总和大于50亿+1,(等于的情况比较特殊,这里假设不等于。)那么关系到中位数计算的两个数应当落在区间

里。

到这里我们可以得到中位数的区间,我们计算一下上面的过程所需内存情况:载入1亿个数据需要内存32*1亿/8/1024/1024=381.5M,100000个数据组的统计值需要内存8*100000/1024/1024=0.76M 总和小于512,是可行的。

现在我们知道涉及中位数计算的两位数的区间是

,而

里有43000个数据,在

之前的区间中的数据总数为

,下面我们需要找到第50亿个以及第50亿+1这两个数到底是多少。

我们需要再次遍历数据,对落在

区间的数都加以关注,统计

区间内数字

出现的频词

再次分100次载入数据,对落在

区间的数进行关注,为

区间内的每一个整数

都设计一个统计值

区间有43000个数据,所以有43000个统计量。

全部载入完成之后,我们再在

的基础上累加

,如果加上

大于50亿了,那么第50亿大的数据就是

,第50亿+1大的数同理。这样我们就可以计算中位数了。

再次对上面的过程进行内存分析,每次载入1亿个数据需要内存381.5M,43000个统计量需要内存肯定小于上面100000个统计量的情况,所以内存也是足够的。哦还有个

需要内存,但是8位,不值一提。

设计思路以上。

4. 总结数据量过大,分次载入

一共需要两次完全遍历数据。

5. 类似题目

大量数据寻找topK,

解决思路:数据多次载入,进行堆排序,每次载入都获得堆的topK,最后将这些topK再进行排序。

加油,一件事竟然决定去做了,就请做好他。耐住性子,慢慢来。

大数据中位数怎么运算_大数据查找中位数相关推荐

  1. 数据的四大特征_大数据

    数据的四大特征_大数据 我们总是在谈数据分析,数据分析什么的,那我们现在先不谈数据分析,我们先来谈谈数据分析的基础--数据.那么到底什么是数据,数据有什么特征呢?这个问题虽基础却重要. 这里我们所说的 ...

  2. 数据科学学习心得_学习数据科学时如何保持动力

    数据科学学习心得 When trying to learn anything all by yourself, it is easy to lose motivation and get thrown ...

  3. java大作业设计_Java程序设计_大作业.doc

    Java程序设计_大作业.doc Java程序设计_大作业 专业:计算机科学与技术专业 学号:1245713131 姓名: 2014年12月10日 目录 作业内容:2 1.IPublisherDao接 ...

  4. 数据科学与大数据技术的案例_作为数据科学家解决问题的案例研究

    数据科学与大数据技术的案例 There are two myths about how data scientists solve problems: one is that the problem ...

  5. 大数据项目开发案例_大数据开发相关术语解析

    Java['dʒɑːvə] 当前软件开发行业应用最广.就业量最大的编程语言,在各类编程语言排行榜长期位列第一.是企业软件开发的首选语言,也是Android系统的开发语言. Java吸取了C++语言的众 ...

  6. 大数据薪水大概多少_大数据工资一般多少

    大数据工资一般多少?以北京为例,大数据工程师的平均工资经过两年的发展在直线上涨.随着个人能力的全面提升,大数据工程师的薪资水平也必定会水涨船高. 大数据是一种规模大到在获取.存储.管理.分析方面大大超 ...

  7. 大数据介绍项目流程_大数据介绍

    大数据介绍项目流程 About Big Data 关于大数据 什么是大数据?(What is Big Data?) In modern world, there are many big proble ...

  8. 大数据 端到端_成为数据科学家的端到端指南

    大数据 端到端 数据科学提示/入门指南 (DATA SCIENCE TIPS /BEGINNERS GUIDE) Data Science has improved considerably over ...

  9. 大数据架构详解_【数据如何驱动增长】(3)大数据背景下的数仓建设 amp; 数据分层架构设计...

    背景 了解数据仓库.数据流架构的搭建原理对于合格的数据分析师或者数据科学家来说是一项必不可少的能力.它不仅能够帮助分析人员更高效的开展分析任务,帮助公司或者业务线搭建一套高效的数据处理架构,更是能够从 ...

最新文章

  1. 怎样学好网络(1)-正确的定位
  2. java sqlite mybatis_Spring boot + Mybatis + SQLite 搭建blog API
  3. 产品体验分析之7步走(附PPT)
  4. ArrayList为何线程不安全,如何解决
  5. hdu 4279 Number
  6. mysql时间相关函数和操作
  7. 如何用指针判定系统是32bit还是64bit?一次惨痛的经历,想想都脸红
  8. 二分查找(java)
  9. Pascal VOC2011落下帷幕
  10. 【优化求解】基于matlab改进的灰狼算法求解重油热解优化模型【含Matlab源码 164期】
  11. 第二阶段—个人工作总结02
  12. 运用二维数组打印杨辉三角(找规律题)
  13. 组装一台计算机必需的配件有,哪位可以告诉我自己想组装一台电脑需要那些配件...
  14. [附源码]计算机毕业设计基于Springboot校园运动会管理系统
  15. e4a 蓝牙温度app_IIOT应用之Arduino无线蓝牙温湿度和距离测量系统
  16. word怎么根据点画曲线_用word怎么画曲线图 word里如何绘制曲线图
  17. 解决java网络编程IPv6问题
  18. 如果格局决定人生,那到底什么决定了格局
  19. 谈商业软件的发展趋势
  20. 没有哈密瓜只有哈密顿----图论之哈密顿回路

热门文章

  1. Axure——快捷键
  2. 200代码写一套属于自己的事件总线(EventBus)库
  3. Unity Shader 素描渲染
  4. 桌面图标显示异常修复
  5. 宝付国际受邀参加鼎堃跨境电商俱乐部七周年盛典
  6. 下一代大数据系统和4S标准
  7. 计算机网络协议简称汇总
  8. Clickhouse彻底删除表, drop表后重新创建报错,Code: 342, Existing table metadata in ZooKeeper differs in primary key
  9. 《林徽因——不慌不忙的坚强》笔记和感悟
  10. 二 需求工程和设计模式