算法要求
输入:一个最多包含n个正整数的文件,其中每个数字都小于n(n=10^7)没有重复文件
输出:按照升序输出
约束条件:只有1M左右的内存空间,足够的磁盘空间。最多运行为几分钟,如果为10秒就不需要优化。
在我上学刚毕业那会曾经碰到过三个面试官提问我这道题,当时我第一次的回答是简单的冒泡排序,面试官直接提醒了我,内存有限,后来我灵机一动,我可以借助第三方数据库,先把它存到数据库,然后order by顺序查询出来。很明显,这是一个不是办法的办法。当然,我当时也是答非所问。但是现在回过头来想一想,还是有办法解决的。
问题分析
如果说我们把这些数据引入到内存进行排序显然是不现实的,因为一部分n的大小都可能超过1M,这时我们可以考虑使用位图排序。
实现概要
假设我们有一组 {3,1,8,5,4,9} 这样的一组小于10数据。我们可以用如下字符串进行表示这个集合
0 1 0 1 1 1 0 0 1 1 其中代表集合中的数据表示为1,其它的为零
如果我们使用伪代码可以如下实现:
1 初始化一个大小为n的数组
for n = [1,n);
bit[i] = 0
2 顺序读取每个文件中每一个数字
for each i;
bit[i] = 1;
3 输出
for n = [0,n);
if(bit[i]==1)
print i;
java代码实现
int[] arrs = {12,234,13,1,143,321,1411};//磁盘中的文件
int[] sorts = new int[2000];
for(int arr : arrs) {
sorts[arr] = 1;
}
for(int i=0;i<2000; i++) {
if(sorts[i] == 1) {
System.out.print(i+",");
}
}
总结
该排序使用了位图数据结构(*该数据结构描述了有限定义域内的稠密集合,其中的每一个元素最多出现一次,并且没有其他任何数据与该元素关联*)。这里可能会引出来个问题?
1 如果严格要求是1M内存怎么办?
2 如果里面的数据有重复出现的数据怎么办?
位图排序算法
最新推荐文章于 2019-07-13 16:25:21 发布