bitmap算法应用

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");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值