002 位图数据结构

前言:位图主要是用1位,来代表某个值存在与否。本文使用Java语言实现简单的位图操作,使用char数组来存储位。在Java语言中,一个char占两个字节,16位。

1、构造一个位图对象;

public BitMap(int bitSize) {
	this.bitSize = bitSize;
	this.chars = new char[bitSize/16 + 1];
}

2、占位操作;

public void setBit(int index) {
	if(index >= bitSize) {
		return;
	}
	int byteIndex = index / 16;
	int bitIndex = index % 16;
	chars[byteIndex] |= 1 << bitIndex;
	//number << 1; number向左移动一位,即在右边用0填充
	//1010向左移动一位,结果为10100
	//a|=b,a与b进行或操作后,将值赋予a
	//举例:00000001 |= 00000010,结果为00000011
}

3、判断该位是否已占用;

public boolean get(int index) {
	if(index >= bitSize) {
		return false;
	}
		
	int byteIndex = index / 16;
	int bitIndex = index % 16;
	//number << 1; number向左移动一位,即在右边用0填充
	//((00000100 & (00000001 << 2)) != 0)运算讲解:
	//1)00000001 << 2,即00000001向左移动两位,即在00000001的右边补两个0,为00000100;
	//2)00000100 & 00000100,&为与操作,结果为00000100
	//3)00000100 != 0,结果为true
	boolean result = (chars[byteIndex] & (1<

4、位打印操作;

public void print() {
	for(char b : chars) {
		print(b);
	}
}
	
private void print(char b) {
	String result = Integer.toBinaryString(b);
	int len = result.length();
	if(len < 16) {
		for(int i = 0; i < 16-len; i++) {
			result = "0" + result;
		}
	}
	System.out.println(result);
}

5、测试占位操作;

@Test
public void testSetBit() {
	BitMap bitMap = new BitMap(8);
	for(int i = 0; i < 8; i++) {
		bitMap.setBit(i);
		bitMap.print();
		System.out.println("================");
	}
}

结果打印:
0000000000000001
================
0000000000000011
================
0000000000000111
================
0000000000001111
================
0000000000011111
================
0000000000111111
================
0000000001111111
================
0000000011111111
================

6、延伸···布隆过滤器;

1)布隆过滤器是基于位图来实现的,纯纯的位图是用一位就代表一个值的存在与否,而布隆过滤器则是用位图上的多位来代表一个值的存在与否。

2)假定现在有1千万个数字,其范围是1~100亿,如果用位图对应下标的占位情况,来判断对应数字的存在与否,那么需要100亿位的内存空间。因为数字的范围是1~100亿。

3)但真实的数据个数仅有1千万个,用100亿的内存空间来存储,浪费严重。

4)利用哈希的思想,可以将1~100亿范围的数字,哈希对应成1~1亿范围的数字。如果这样处理,那么仅需要1亿位的内存空间。

5)不过,哈希总是会有冲突的。

6)比如mod(1亿)这个函数,1去哈希1亿,得到结果为1。1亿零1去哈希,得到的结果也为1。

7)位图下标为1的位,无法判断该位是1、1亿零1、10亿零1…………99亿零1。

8)若此时,用多个哈希函数出来的结果,作为该数字的表示,那么冲突就会非常小。

9)布隆过滤器正是基于此思想而提出,尽管它还会存在误判的情况(就算是多个哈希函数也是有可能出现冲突的),但在多个哈希的结果下,冲突的概率已经非常小。

你可能感兴趣的:(算法与数据结构,位图,布隆过滤器)