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");
}
}
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");
}
}
相关文章推荐
- 提升方法
- 字符十六进制转十进制
- ABP源码分析三十八: ABP.Web.Api.OData
- js判断为空Null与字符串为空实例
- BZOJ_1798_&_Codevs_2216_[AHOI_2009]_行星序列_(线段树)
- 尝试 ES6 中的箭头函数
- WebBrowser学习
- 特性
- SQL Server CDC Admin & Monitor
- 在线编程--输出单向链表中倒数第k个结点
- TCP协议中的三次握手和四次挥手(图解)
- 7--函数
- 地域划分 编程题
- docker -v挂载数据卷网络异常的问题
- 图片随机翻转
- 二叉树平摊
- KMP算法的next[]数组通俗解释
- windows脚本设置ip
- #include<file.h>与#include"file.h"的区别
- Bluetooth蓝牙