位图法处理海量数据常见使用

位图的基本概念
用一个位(bit)来标记某个数据的存放状态,由于采用了位为单位来存放数据,所以节省了大量的空间。举个具体的例子,在Java中一般一个int数字要占用32位,如果能用一位就表示这个数,就可以缩减大量的存储空间。一般把这种方法称为位图法,即Bitmap。

BitSet
正因为位图运算在空间方面的优越性,很多语言都有直接对它的支持。如在C++的STL库中就有一个bitset容器。而在Java中,在java.util包下也有一个BitSet类用来实现位图运算。此类实现了一个按需增长的位向量。BitSet的每一位都由一个boolean值来表示

使用场景
1.海量数据排序

    /**
     * 位图法对海量数据排序
     * @param arr
     */
    public static void printSoredStr(int[] arr){
        BitSet bs = new BitSet();
        for(int num:arr){
            bs.set(num, true);
        }
        for(int i=0;iif(bs.get(i)){
                System.out.print(i+",");
            }
        }
    }

2.海量数据去重

    /**
     * 位图法判断某数字是否存在(去重)
     * @param arr
     * @param flag
     * @return
     */
    public static boolean findRepeatnum(int[] arr,int flag){
        if(arr==null)
            return false;
        else{
            BitSet bs = new BitSet();
            for(int num:arr){
                bs.set(num, true);
            }
            if(bs.get(flag)){
                return true;
            }
            return false;
        }
    }

3.位图法找出唯一重复的两个数

    /**
     * 利用位图法找出唯一重复的两个数
     * @param arr
     */
    public static void findOnlyOneRepeat(int[] arr){
        if(arr!=null){
            BitSet bs = new BitSet();
            for(int i=0;iif(bs.get(arr[i])){
                    System.out.println("重复的数:"+arr[i]);
                }else{
                    bs.set(arr[i], true);
                }
            }
        }else{
            System.out.println("数组为空");

        }
    }

4.利用位图法对字符串进行全排列

/**
     * 对一个字符串进行全排列
     * @param str
     */
    public static void quanpailie(String str){
        int length = str.length();
        HashMap map = new HashMap();
        HashSet set = new HashSet();
        for(int i=0;i1));
        }
        int m = 1<for(int j=1;jnew StringBuffer();
            int flag = 0;
            int k = j;
            while(flagif((k&1)!= 0){
                    sb.append(map.get(flag));
                }
                k = k>>1;
                flag++;
            }
            set.add(sb.toString());
        }
        for(String printstr:set){
            System.out.print(printstr+",");
        }
    }

你可能感兴趣的:(java面试常见算法)