位图排序算法

算法要求

输入:一个最多包含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 如果里面的数据有重复出现的数据怎么办?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值