【数据结构】BitMap使用

BitMap介绍

大数据是越来越火热的一个词语,对大数据的处理也同样是各种公司面试的常问题目。对大数据处理有几种通用的方式:分治,分布式,bitmap,bloom filter。bitmap与bloom filter主要是用于对大数据进行过滤,找到符合某些条件的数据。本文对bitmap进行简单分析。

java中有对bitmap的实现,是java,util.BitSet。

其提供了两种构造方法:

BitSet()
创建一个新的位 set。
BitSet(int nbits)
创建一个位 set,它的初始大小足以显式表示索引范围在 0nbits-1 的位。

BitSet所有的操作都是对某一位进行操作的,比如public void set(int bitIndex, boolean value) 就是对bitIndex这一位进行赋值操作,而不是对大小进行赋值。比如set(1, true)表示对第二位赋值为true,真实表现为10.如果想表示2曾经出现过,那么就需要set(1, true),因为2的二进制表示就是10。


其中BitSet提供了两种获取大小的方法,length(),size(),注意这两种方法是不同的。

length():返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加 1。如果 BitSet 中不包含任何设置位,则返回零;比如你new了一个bitSet,bitSet(100,true)。那么对其调用length(),则返回的是101.

size():而这个方法返回的是在实际存储中,BitSet为了存储你的数据总过占据了实际位数是多少。比如,你使用了第二种构造方法new BitSet(100),在计算机中都是按照字节来标识,所以对于100肯定需要一个大约100的整字节数进行存储,这时候返回的size就是128.其实最主要的是BitSet内部封装了一个long型的数组,每次new一个新的BitSet对象都是对long型的数组进行分析和处理的。最后返回的位数其实就是需要几个long型的数字,比如128位,则其实是16个字节,则表示需要两个long型的数字来表示整个bitset。

最长子序列

给定一个数组,求该数组中最长的连续子序列。思路可以是先排序,但是排序都是需要O(nlogn)的复杂度,那有没有O(n)的负责度的算法那。答案肯定是有的,而且有很多种办法。本文是利用了bitmap,也可以利用hashmap。

思路:是先对数组进行遍历,对数组中的每个数在bitmap中设置为1,然后对bitmap进行遍历,查找最长连续出现的序列

private static void process() {
        int[] array = {15, 7, 12, 6, 14, 13, 9, 11};
        BitSet bitSet = new BitSet();
        for(int e : array){
            bitSet.set(e);
        }
        int max = 0;
        int tmp = 0;
        for(int i = 0; i < bitSet.size(); i ++){
            if(bitSet.get(i)){
                tmp += 1;
            }else{
                if(tmp > max){
                    max = tmp;
                }
                tmp = 0;
            }
        }
        System.out.println(max);
    }

    public static void main(String[] args) {
        process();
    }


你可能感兴趣的:(编程语言,算法与数据结构)