双层桶

双层桶

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

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

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

 

适用范围

第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)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值