【学习笔记】Bit-map数据结构

来源:互联网 发布:单片机最小系统图 编辑:程序博客网 时间:2024/05/21 09:02

实际上Bit-map就是一个hash表,只是该hash表的每一个单元为一个bit,也就是该hash表示一个bit数组,每一条数据(Value)通过hash函数映射到bit数组中的某一位。正因为每一条数据只需一个bit来记录,所以该数据结构的空间效率是非常高的。


我的总结:

1、Bit-map不保存原始数据,只标记该数据是否出现过;

2、关于Bit-map计数:由于Bit-map每一个单元为一个bit,如果用来计数的话可以记录出现0次或者1次,也就是Bit-map最常见的应用——用于记录数据是否出现过(如下面的【例1】)。某些时候可以对Bit-map扩展,每个单元为2bit,这样每个单元可以记录0、1、2和3四种值,扩展以后就可以有特殊的应用(如下面的【例2】)。如果将每个单元再继续扩大的话(比如扩展成8位、32位),就不能称之为Bit-map了,就成了普通的hash表了,也失去了Bit-map空间效率高的特点了;

3、观与Bit-map删除数据:正常情况下(没有发生地址冲突)数据到bit位是一一对应的,因此Bit-map是可以删除数据的,某条数据添加后相应的bit置为1,删除数据只需将相应的bit置为0即可。相比之下,Bloom Filter是不能删除数据的;

4、既然Bit-map也是hash表,因此如果hash函数不能百分之百完美,也是会发生地址冲突的,如果是普通的hash表示可以通过”拉链法“等方法解决地址冲突,而Bit-map一般不会去解决地址冲突(为了其使用起来方便高效),因此实际应用中如果有地址冲突的情况也就相当于有一定的错误率,【文献1】中提到“若要降低冲突发生的概率到1%,就要将位数组的长度设置为数据个数的100倍,这显然是很浪费存储空间的,对于该问题,Bloom Filter就更加优越了(见本博客下一篇文章(http://blog.csdn.net/lewsn2008/article/details/8665622));

5、应用场合,下面由两个例子,用Bit-map的数据结构真是再合适不过了。


【例1】已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)……

【例2】2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理……


参考文献:

【1】http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html
【2】http://blog.sina.com.cn/s/blog_6f7ecc9b0100myum.html