多层划分
方法介绍
多层划分法,本质上还是分而治之的思想,因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后在一个可以接受的范围内进行查找。
问题实例
1. 寻找不重复的数
2.5 亿个整数中找出不重复的整数的个数,内存空间不足以容纳这 2.5 亿个整数
分析:类似于鸽巢原理,因为整数个数为 2
32,所以,我们可以将这 2
32个数,划分为 28个区域(比如
用单个文件代表一个区域),然后将数据分离到不同的区域,最后不同的区域再利用 bitmap 就可以直接解
决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。
2. 寻找中位数
5 亿个 int 找它们的中位数。
分析:首先将 int 划分为 2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后根据统计结
果就可以判断中位数落到哪个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们
只统计落在这个区域中的那些数就可以了。
实际上,如果不是 int 是 int64,我们可以经过 3 次这样的划分即可降低到能够接受的程度。即可以先
将 int64 分成 2^24个区域,确定区域的第几大数,然后再将该区域分成 2^20个子区域,确定是子区域的第几
大数,最后当子区域里的数的个数只有 2^20个时,就可以直接利用直接寻址表 direct addr table 进行统计了。