双层桶
双层桶不是数据结构,只是一种算法思维,分治是其根本思想。在处理海量数据时,有着一席之地。
当我们有一大堆数据需要处理,而局限于各种资源限制(内存、范围等)又不能一次处理完毕,此时,我们就需要将这一大堆数据分成我们可以处理的多个小段数据。然后,按照一定的策略处理各小段数据,从而完成既定目标。
双层桶并不是要求我们只能把我们的大数据划分一次,双层是个虚指,如果有需要,可以把数据一层一层的进行分割,一层一层的处理,直至可以完成目标。
适用范围
第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)。