多层划分

多层划分

方法介绍

多层划分法,本质上还是分而治之的思想,因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后在一个可以接受的范围内进行查找。

问题实例

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 进行统计了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值