.双层桶划分
来源:互联网 发布:荔枝软件下载 编辑:程序博客网 时间:2024/04/30 03:54
双层桶划分 ----其实本质上就是【分而治之】的思想,重在“分”的技巧上!
适用范围:第k大,中位数,不重复或重复的数字
基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子。
扩展:
问题实例:
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进行统计了。
适用范围:第k大,中位数,不重复或重复的数字
基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子。
扩展:
问题实例:
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进行统计了。
- 双层桶划分
- 双层桶划分
- .双层桶划分
- 海量数据处理专题之双层桶划分
- 海量数据处理之双层桶划分
- 海量数据处理之双层桶划分
- 海量数据处理问题之双层桶划分
- 海量数据处理专题(六)——双层桶划分
- 海量数据处理专题(六)——双层桶划分
- 海量数据处理专题(六)——双层桶划分
- 海量数据处理专题(六)——双层桶划分
- 双层桶
- 双层桶
- 双层桶-中位数求解
- 海量数据处理双层桶
- 海量数据处理双层桶
- 双层循环
- 双层汉诺塔
- 【Tomcat】Myeclipse+tomcat遇到的问题(Address already in use: JVM_Bind<null>:8080)
- IOS开发入门基本知识——UIButton生成的关灯游戏(tag值的灵活运用)
- Vs2013 & .net framework 4.5.1 预览介绍
- android开发之res下的menu (xml+代码的形式)
- UVA--1312--Cricket Field
- .双层桶划分
- 从拉马努金到张益唐——数学是一个整体
- Execl导入问题之文本转换
- The Star Zoo——7、The answer is robots
- struts2框架实现基本原理
- 面向过程的代码符合大众的思维方式吗?
- Cocos2d-x 实例源码分析之三 ActionTest ( Manual Transformation )
- Java复制文件及复制文件夹
- 学习Linux二(创建、删除文件和文件夹命令)