算法——bit处理数据

题目

给定一个输入文件,包含40亿的非负整数,请设计一种算法,产生一个不在该文件中的整数。假设你有1GB内存来完成这项任务。如果只有10MB内存又该怎么办。假定所有值都是唯一的。[摘自程序员面试金典]
解题思路:一般遇到这种大批量的数据需要处理时,我们首先要告诉自己,解决方法肯定不会超出我们平时所学的。我们也可以适当的将题目简化。看着这么大的数据,我们不妨先从简单的做起。正常的,我们查找非负整数中不出现的数,在内存足够的情况下,我们可以定义一个数组,将每个数作为数组下标,出现了,改下标对应的值就加1,否则就为0.然后再来一次遍历就可以解决。这个想法能不能放在该题上呢?
40亿等于2^32次方。有1G的内存,既然所有值都是唯一的,我们完全可以用一个bit位来表示该数是否存在。1G的内存表示的bit位是80亿,明显是满足需要的。这里面我们也可以用BitSet类来解题。

    long numofInts=((long)Integer.MAX_VALUE+1);
    byte[] bitfield=new byte[(int)(numofInts/8)];
    void findNum() throws FileNotFoundException
    {
        Scanner in=new Scanner(new FileReader("file.txt"));
        while(in.has
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值