算法通关村-----位运算在海量元素中查找重复元素的妙用

用4KB内存寻找重复元素

问题描述

给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB内存可用,如何打印数组中所有的重复元素。

问题分析

Java中存储整数使用int或者long,这里使用int就可以了。每一个int整数占四个字节,320004B=128KB,题目中要求我们只使用4KB,很明显我们不能使用int来存储,最为节省空间的存储方式就是使用位来存储,即bit,4KB可以寻址48*2^10=32768>32000,即对于从1到N的整数,我们可以遍历数组,如果某个整数第一次出现,将其对应的下标置1,如果该整数再次被遍历到且下标为1,则判定为重复。

代码实现

public void checkDuplicatesIn32000(int[] array) {
        BitSet bitSet = new BitSet(32000);
        for (int i = 0; i < array.length; i++) {
            int num = array[i];
            int num0 = num - 1;
            if(bitSet.get(num0)){
                System.out.println(num);
            }else {
                bitSet.set(num0);
            }
        }
    }

你可能感兴趣的:(算法,数据结构,java)