BitMap介绍
大数据是越来越火热的一个词语,对大数据的处理也同样是各种公司面试的常问题目。对大数据处理有几种通用的方式:分治,分布式,bitmap,bloom filter。bitmap与bloom filter主要是用于对大数据进行过滤,找到符合某些条件的数据。本文对bitmap进行简单分析。
java中有对bitmap的实现,是java,util.BitSet。
其提供了两种构造方法:
BitSet() 创建一个新的位 set。 |
BitSet(int nbits) 创建一个位 set,它的初始大小足以显式表示索引范围在 0 到 nbits-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(); }