双层桶

来源:互联网 发布:上交所龙虎榜数据 编辑:程序博客网 时间:2024/04/30 03:38

双层桶

双层桶不是数据结构,只是一种算法思维,分治是其根本思想。在处理海量数据时,有着一席之地。

当我们有一大堆数据需要处理,而局限于各种资源限制(内存、范围等)又不能一次处理完毕,此时,我们就需要将这一大堆数据分成我们可以处理的多个小段数据。然后,按照一定的策略处理各小段数据,从而完成既定目标。

双层桶并不是要求我们只能把我们的大数据划分一次,双层是个虚指,如果有需要,可以把数据一层一层的进行分割,一层一层的处理,直至可以完成目标。

 

适用范围

第K大

中位数

不反复或反复的数字

 ......

 

实例

1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以包容这2.5亿个整数。

整数个数为2^32,也就是,我们可以将这2^32个数划分为2^8个区域,然后不同的区域在使用bitmap等方式处理了。也可以直接用bitmap处理,每两个bit位表示一个整数,00表示整数未出现,01表示出现一次,10表示出现两次及其以上。

 

2).5亿个int找它们的中位数。

我们将int分别为2^16个地区,然后读取数据统计落到各个地区里的数的个数,以后我们凭据统计成果就能够判定中位数落到哪个区域,同时晓得这个区域中的第几大数恰好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数便可以了。

 

3).此刻有一个0-30000的随机数生成器。请凭据这个随机数生成器,计划一个抽奖范围是0-350000彩票中奖号码列表,个中要包括20000其中奖号码。

一个0到3万的随机数生成器要生成一个0到35万的随机数。那么我们完整可以将0-35万的区间分成35/3=12个区间,然后每一个区间的长度都小于3万,我们就可以用问题给的随机数生成器来生成为了,然后再加之该区间的基数。每一个区间要生成的随机数个数:区间长度*随机数密度,30000*(20000/350000)。

 

0 0
原创粉丝点击