No.0024-CareerCup

问题描述

Given a packed file with 1Tb of 64-bit doubles (first 8 bytes are first double, next 8 bytes are next, etc), find the exact value of median. For simplicity assume the number of doubles is odd. You cannot modify the file and you have only 8Gb of free memory. You may use no more than 2 passes through file and your algorithm should work in all cases.
给1Tb的64比特double类型数据,每一个占8字节。在限制8GB内存,不多于2遍遍历文件的条件下,求准确的中位数。假设有奇数个double。

询问补充

思路分析

这属于大数据问题。
首先是做一些基本的计算。
1T=1024G=2^40B,因为1个Double有8B,因此总共是2^37个Double数据。

假如没有限制

这类带限制的问题的一个套路就是,先思考没有限制的解法。
就和普通算法题思考暴力破解方法类似。当然不能花太多时间。
最直白的就是排序,然后选中间那个就是中位数了。当然在这里不太现实,因为要容下所有Double的话,需要1T内存。
另一个常见的求中位数的方法也需要大量内存,就是维持min heap和max heap,把数据分成两份,中位数就在堆顶。不过这个方法同样对内存没有优化。
不用内存的方法:每次只处理1位,知道中位数在哪里,然后继续,直至找到。例如第一次计数最高位为0的和为1的,然后知道中位数在哪一堆,之后重复即可。缺点是需要遍历足足64次。
优化一点内存的方法:8B=64bit,直接二分,也就是用高32位作为桶的标签来做桶。那么就有2^32个桶。然后就可以找到中位数在哪个桶,之后继续重复以低32位作为桶的标签再来。因为每个桶最多有2^37个Double,也就是说每个桶需要37位来表示这个桶里面有多少Double,第一次分32位,也就是说需要37*2^32bit的内存,约20Gb。这种方法2次遍历,符合题目条件。

有限制

因为只有8G内存,而上面提到的优化内存之后的方法仍旧需要20G,因此还得再继续考虑优化。

解法

这个思路点破了也就没什么了,就是取模的意思。当然还是比较巧妙的。
首先对半分桶的思路是没有问题的。大部分大数据问题都有类似的思路。而很明显第一次遍历的时候内存压力是最大的,因此只要能cover第一次,后面的都没有问题。
因为有2^32个桶,那么造2^32的字节数组,也就是说每个容量是1byte,那么需要4GB。
此外,创造一个32bit的整型数组。
对于字节数组,因为1byte=8bit,2^8=256,也就是说只能计数255次,当超过次数的时候即溢出,从0开始,那么最多可以溢出2^37/2^8=2^29次,每次溢出时把对应的前缀加入到整型数组当中,也就是最多有2^29*32/8=2GB。
当第一遍遍历结束时,因为每次溢出都会把前缀加入到整型数组,因此可以对整型数组从小到大排序,前缀出现的次数也就代表着溢出次数,一个前缀实际存在的次数就是桶里面剩余的次数+整型数组里面出现的次数x256。这样就做到了对前缀的计数。
之后找到中位数所在的前缀之后,再对低32位进行一次即可。
该方法仅仅使用了6G内存,还有2G剩余。

总结

非常典型的Big Data问题,很有代表性。难度:medium~hard。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 9.3.3 快速排序   快速排序将原数组划分为两个子数组,第一个子数组中元素小于等于某个边界值,第二个子数组中的...
    RichardJieChen阅读 1,839评论 0 3
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,696评论 0 11
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,784评论 1 10
  • 孩子们的暑假来了,真的是羡慕,对于工作的我,心里有一个小小的梦,好想把英语学好,英语一直以来都是我的痛,从初中起就...
    糖葫芦酸溜溜阅读 164评论 0 0
  • 上学时,有的时候总在注意自己的行为礼仪,要优雅或者要有范,所以有的时候总是害羞不敢做。其实归根究底就是想在自己心中...
    卷纸泡阅读 620评论 0 0