首页 > 其他分享 >美团一面:如何在 100 亿数据中找到中位数?

美团一面:如何在 100 亿数据中找到中位数?

时间:2024-07-25 15:54:21浏览次数:18  
标签:文件 数字 美团 中位数 亿个 file 100

 

海量数据中找到中位数,内存肯定是无法一次性放下这么多数据的

中位数定义:数字排序之后,位于中间的那个数。比如将 100 亿个数字进行排序,排序之后,位于第 50 亿个位置的那个数就是中位数。

桶排序

1)创建多个小文件桶,设定每个桶的取值范围,然后把海量数据元素根据数值分配到对应的桶中,并记录桶中元素的个数

2)根据桶中元素的个数,计算出中位数所在的桶(比如 100 亿个数据,第 1 个桶到第 18 个桶一共有 49 亿个数据,第 19 个桶有 2 亿数据,那么中位数一定在第 19 个桶中),然后针对该桶进行排序,就可以求出海量数据中位数的值(如果内存还是不够,可以继续对这个桶进行拆分;或者直接用 BitMap 来排序)

简单用 100 个数据画个图直观理解下:

分治法 + 基于二进制比较

假设这 100 亿数据都是 int 类型,4 字节(32 位)的有符号整数,存在一个超大文件中。

将每个数字用二进制表示,比较二进制的【最高位】 (第 32 位),如果数字的最高位为 0,则将这个数字写入 file_0 文件中;如果最高位为 1,则将该数字写入 file_1文件中。

最高位为符号位,也就是说 file_1 中的数都是负数,而 file_0 中的数都是正数。

通过这样的操作,这 100 亿个数字分成了两个文件,假设 file_0 文件中有 60 亿个数字,而 file_1 文件中有 40 亿个数字。

这样划分后,思考一下:所求的中位数在哪个文件中?

100 亿个数字的中位数是 100 亿个数排序之后的第 50 亿个数,现在 file_0 有 60 亿个正数,file_1 有 40 亿个负数,file_0 中的数都比 file_1 中的数要大,排序之后的第 50 亿个数是中位数,那么这个中位数一定位于 file_0 中,并且是 file_0 文件中所有数字排序之后的第 10 亿个数字。

现在,我们只需要处理 file_0 文件了(不需要再考虑 file_1 文件)。

而对于 file_0 文件,可以同样地采取上面的措施处理:将 file_0 文件依次读一部分到内存,将每个数字用二进制表示,比较二进制的【次高位】(第 31 位),如果数字的次高位为 0,写入 file_0_0 文件中;如果次高位为 1 ,写入 file_0_1 文件中。

现假设 file_0_0 文件中有 30 亿个数字,file_0_1 中也有 30 亿个数字,则中位数就是:file_0_1 文件中的数字从小到大排序之后的第 10 亿个数字。

抛弃 file_0_0 文件,继续对 file_0_1 文件 根据【次次高位】(第 30 位) 划分,如此反复下去

标签:文件,数字,美团,中位数,亿个,file,100
From: https://www.cnblogs.com/myf008/p/18323329

相关文章

  • 三本IEEE会议“一区顶刊”大PK!年发文量>1000+,千万别错过!
    关于IEEE关于IEEEIEEE(TheInstituteofElectricalandElectronicsEngineers,电气电子工程师学会)是目前全球最大的非营利性专业技术学会,在全球160多个国家拥有超过45万名会员。IEEE在电气电子、计算机、半导体、通讯、电力能源、生物医学工程、航天系统工程、消费电子等......
  • 1001 A+B Format
    Calculatea+bandoutputthesuminstandardformat--thatis,thedigitsmustbeseparatedintogroupsofthreebycommas(unlesstherearelessthanfourdigits).InputSpecification:Eachinputfilecontainsonetestcase.Eachcasecontainsapairof......
  • ccfcsp 201803.2 碰撞的小球 100分代码
    本题是一道小模拟规模小难度在碰撞检测在写模拟题时的思路应该是先找到应该储存的信息是哪些,抽象出来,应该模拟的方法是哪些。类似oop。includeusingnamespacestd;constintL=1000;structball{intp;chard=1;//只可能为1或-1,表示方向}b[L+1];intmain(){int......
  • LeetCode 热题 HOT 100 (007/100)【宇宙最简单版】
    【数组】No.0215数组中第k个最大的元素【中等】......
  • Python3打开图片时请求ConnectionResetError(10054)
    我试图从'http://xxx.jpg'之类的网站下载图片。代码:headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/66.0.3359.139Safari/537.36'}url='http://xxx.jpg'resp......
  • 谷歌微软用电量比100多个国家还多!AI还将推高它们的耗电量
    最新统计显示,2023年谷歌、微软各自消费电力25TWh(250亿千瓦时)。在全球共197个国家中,谷歌微软各自消耗的电量比其中的100多个国家还要多。一家全球化互联网科技企业每年到底会消耗多少电力?数字可能会让你震惊。最新统计显示,2023年谷歌、微软各自消费电力25TWh(250亿千瓦时)。在......
  • 林史·语其九(91-100)
    #91沟槽的中文输入法#92DZ:zyz呢DZ:他*的他过来把脸贴着门敲我们宿舍门玻璃,我说这头发怎么这么长,看着有点像zyzDZ:结果真他*是#93#94CTH:给我讲一个表面温馨但是实际上很恐怖的故事Qinyun:明天没有模拟赛#95HDK:我草,完了lbtl:咋HDK:我蚊帐里有蚊子Qinyu......
  • 在python中查找区间数据的中位数
    我正在探索不同的python库,我想知道如何找到分组数据集的近似中值。这里有一个表格供参考。年龄频率1-1012310-203502......
  • MM6100 MOTOROLA 可信处理器模块
    品牌、MOTOROLA品名:可信处理器模块接口:4通道电流:24毫安原产地:USA美国MM6100系列是首款采用TundraTs41*VMEbus接口芯片设计的MEbu单板计算机(SCO,提供2eSTVMEbus性能.2essT两个边象源同步传输协议便VMEbus在大多数情况下以320MB/s的实际带宽运行。MVME162PA-344SE-G2......
  • 某人有100,0000元,每经过一次路口,需要交费,规则如下: 1)当现金>50000时,每次交5% 2)当现
    1publicclassexercise08{2//编写一个main方法3publicstaticvoidmain(){4/*5某人有100,0000元,每经过一次路口,需要交费,规则如下:61)当现金>50000时,每次交5%72)当现金<=50000时,每次交100008编程计算该人可......