您的位置:首页 > 其它

bitmap算法应用

2016-04-26 19:56 232 查看
bitmap的具体原理以及应用场景在这里就不详述,具体可以参见:
http://www.mamicode.com/info-detail-466404.html和http://kb.cnblogs.com/page/515258/
下面考虑bitmap的两种应用场景:

(1)应用bitmap对不同数进行排序操作,java实现如下:public class Bitmap {
// maxNum:最大数值
int maxNum = 1000;
/*
* arraySize:计算出出maxNum的数所需要的存储空间,一般采用数组进行存储,1 int=4 byte, 1 byte=8 bit, 因而
* maxNum/32为1个数组单元可以存储的bit数量 array:保存二进制数
*/
int arraySize = (int) Math.ceil((double) maxNum / 32);
private int array[] = new int[arraySize];

public static void main(String[] args) {
Bitmap bm = new Bitmap();
// 初始化
bm.initBitMap();
int sortArray[] = new int[] { 1, 4, 32, 2, 6, 9, 123, 23, 12 };
for (int i = 0; i < sortArray.length; i++) {
bm.set(sortArray[i]);
}
for (int i = 0; i < bm.maxNum; i++) {
if (bm.get(i) != 0) {
System.out.print((i) + " ");
}
}
}

public void initBitMap() {
for (int i = 0; i < array.length; i++) {
array[i] = 0;
}
}

public void set(int pos) {
// 给相应位置1,pos>>5表示该数所在的数组单元,1 << (31 - pos % 32)表示该数在该数组单元中所对应的位置,由于
// 排序按照从左到右夫人顺序进行而不是从右向左,因而需要31-pos%32,而不是直接pos%32
array[pos >> 5] = array[pos >> 5] | (1 << (31 - pos % 32));
}

public int get(int pos) {
return array[pos >> 5] & (1 << (31 - pos % 32));
}
}


(2) 设计一种算法可以求出 某个数字是否 在10亿个数中出现过
由于数组中无法保存10亿个数,这里只说明方法,其中调用的方法与上例中相同

public class Bitmap {
// maxNum:最大数值
static int maxNum = 31250;
/*
* arraySize:计算出出maxNum的数所需要的存储空间,一般采用数组进行存储,1 int=4 byte, 1 byte=8 bit, 因而
* maxNum/32为1个数组单元可以存储的bit数量 array:保存二进制数
*/
int arraySize = (int) Math.ceil((double) maxNum / 32);
private int array[] = new int[arraySize];

public static void main(String[] args) {
Bitmap bm = new Bitmap();
// 初始化
bm.initBitMap();
int sortArr[] = new int[maxNum];
// 构造1000000000个数的数组
for (int i = 0; i < maxNum; i++) {
if (i == 100) {
sortArr[i] = maxNum;
} else {
sortArr[i] = i;
}
bm.set(sortArr[i]);
}
// 将相应为置为1
int forSearch = 100;
System.out.println(bm.get(forSearch) != 0 ? "true" : "false");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: