1 Star 2 Fork 1

无趣的人民艺术家 / The-Art-Of-Programming-By-July

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
06.06.md 1.45 KB
一键复制 编辑 原始数据 按行查看 历史
July 提交于 2014-06-12 17:41 . Rename 06.04.md to 06.06.md

多层划分

方法介绍

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

问题实例

1、2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数

分析:有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。

2、5亿个int找它们的中位数

分析:首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受的程度。即可以先将int64分成2^24个区域,然后确定区域的第几大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里的数的个数只有2^20,就可以直接利用direct addr table进行统计了。

C
1
https://gitee.com/DreamFly0/The-Art-Of-Programming-By-July.git
git@gitee.com:DreamFly0/The-Art-Of-Programming-By-July.git
DreamFly0
The-Art-Of-Programming-By-July
The-Art-Of-Programming-By-July
master

搜索帮助