位图的基本概念
用一个位(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+",");
}
}