海量数据处置专题(六)——双层桶分别 (3)
转自:http://blog.sina.com.cn/s/blog_94d959420100z5j9.html
【甚么是双层桶】?
究竟上,与其说双层桶分别是一种数据布局,不如说它是一种算法计划思惟。面临一堆大量的数据咱们没法处置的时辰,咱们能够将其分红一个个小的单位,而后按照必然的战略来处置惩罚这些小单位,从而到达目标。
【合用局限】
第k大,中位数,不重复或反复的数字
【基来源根基理及要点】
由于元素范畴很大,不克行使直接寻址表,以是通过量次划分,慢慢确定范围,然后末了在一个可以接纳的范围内举行。可以经由过程屡次减少,双层只是一个例子,分治才是其底子(只是“只分不治”)。
【扩大】
当有时刻需求用一个小规模的数据来机关一个大数据,也是可以操纵这类思维,比拟之下分歧的,仅仅此中的逆进程。
【题目实例】
1).2.5亿个整数中找出不重复的整数的个数,内存空间缺乏以包容这2.5亿个整数。
有点像鸽巢道理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(好比用单个文件代表一个区域),然后将数据分手到差别的区域,然后不同的区域在使用bitmap就可以干脆处理了。也就是说只需有充足的磁盘空间,就可以很便利的办理。 固然这个题也能够用我们后面讲过的BitMap方式解决,正所谓条条大道通罗马~~~
2).5亿个int找它们的中位数。
这个例子比下面谁人更较着。起首我们将int分别为2^16个地区,然后读取数据统计落到各个地区里的数的个数,以后我们凭据统计成果就能够判定中位数落到阿谁区域,同时晓得这个区域中的第几大数恰好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数便可以了。
现实上,若是不是int是int64,我们可以颠末3次如许的划分即可下降到可以接管的水平。便可以先将int64分成2^24个区域,然后肯定区域的第几 大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里的数的个数只要2^20,就可以间接哄骗direct addr table停止统计了。
3).此刻有一个0-30000的随机数生成器。请凭据这个随机数生成器,计划一个抽奖范围是0-350000彩票中奖号码列表,个中要包括20000其中奖号码。
这个题刚好和上面两个思想相同,一个0到3万的随机数天生器要生成一个0到35万的随机数。那么我们完整可以将0-35万的区间分成35/3=12个区间,然后每一个区间的长度都小于即是3万,如许我们就可以用问题给的随机数生成器来生成为了,然后再加之该区间的基数。那末要每一个区间天生几多个随机数呢?计较公式便是:区间长度*随机数密度,在本标题中便是30000*(20000/350000)。最终要注重一点,该标题问题是有隐含前提的:彩票,这象征着你生成的随机数内里不克不及有重复,这也是我为何用双层桶划分思想的另一个缘由。

浙公网安备 33010602011771号