Bitmap用来作大数据处理

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)"html

Bit-map空间压缩和快速排序去重

1. Bit-map的基本思想
  32位机器上,对于一个整型数,好比int a=1 在内存中占32bit位,这是为了方便计算机的运算。可是对于某些应用场景而言,这属于一种巨大的浪费,由于咱们能够用对应的32bit位对应存储十进制的0-31个数,而这就是Bit-map的基本思想。Bit-map算法利用这种思想处理大量数据的排序、查询以及去重。
  Bitmap在用户群作交集和并集运算的时候也有极大的便利。算法

2. Bit-map应用之快速排序
  假设咱们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复),咱们就能够采用Bit-map的方法来达到排序的目的。要表示8个数,咱们就只须要8个Bit(1Bytes),首先咱们开辟1Byte的空间,将这些空间的全部Bit位都置为0,
编程

  对应位设置为1:数组

  遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的,时间复杂度O(n)。
  优势:
    运算效率高,不须要进行比较和移位;
    占用内存少,好比N=10000000;只需占用内存为N/8=1250000Byte=1.25M。 
  缺点:
    全部的数据不能重复。即不可对重复的数据进行排序和查找。数据结构

3. Bit-map应用之快速去重
  2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。 
  首先,根据“内存空间不足以容纳这2.5亿个整数”咱们能够快速的联想到Bit-map。下边关键的问题就是怎么设计咱们的Bit-map来表示这2.5亿个数字的状态了。其实这个问题很简单,一个数字的状态只有三种,分别为不存在,只有一个,有重复。所以,咱们只须要2bits就能够对一个数字的状态进行存储了,假设咱们设定一个数字不存在为00,存在一次01,存在两次及其以上为11。那咱们大概须要存储空间几十兆左右。
  接下来的任务就是遍历一次这2.5亿个数字,若是对应的状态位为00,则将其变为01;若是对应的状态位为01,则将其变为11;若是为11,,对应的转态位保持不变。
  最后,咱们将状态位为01的进行统计,就获得了不重复的数字个数,时间复杂度为O(n)。函数

4. Bit-map应用之快速查询
  一样,咱们利用Bit-map也能够进行快速查询,这种状况下对于一个数字只须要一个bit位就能够了,0表示不存在,1表示存在。假设上述的题目改成,如何快速判断一个数字是够存在于上述的2.5亿个数字集合中。
  同以前同样,首先咱们先对全部的数字进行一次遍历,而后将相应的转态位改成1。遍历完之后就是查询,因为咱们的Bit-map采起的是连续存储(整型数组形式,一个数组元素对应32bits),咱们其实是采用了一种分桶的思想。一个数组元素能够存储32个状态位,那将待查询的数字除以32,定位到对应的数组元素(桶),而后再求余(%32),就能够定位到相应的状态位。若是为1,则表明改数字存在;不然,该数字不存在。spa

5. Bit-map扩展——Bloom Filter(布隆过滤器)
  当一个元素被加入集合中时,经过k各散列函数将这个元素映射成一个位数组中的k个点,并将这k个点所有置为1.
  有必定的误判率--在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误判为属于这个集合.所以,它不适合那些"零误判"的应用场合.在能容忍低误判的应用场景下,布隆过滤器经过极少的误判换区了存储空间的极大节省.

  Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每一个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注:若是一个位置屡次被置为1,那么只有第一次会起做用,后面几回将没有任何效果。
.net

在判断y是否属于这个集合时,对y应用k次哈希函数,若全部hi(y)的位置都是1(1≤i≤k),就认为y是集合中的元素,不然就认为y不是集合中的元素。设计

详见:http://www.javashuo.com/article/p-uvastzse-kr.html
htm

6. 总结
  使用Bit-map的思想,咱们能够将存储空间进行压缩,并且能够对数字进行快速排序、去重和查询的操做。Bloom Fliter是Bit-map思想的一种扩展,它能够在容许低错误率的场景下,大大地进行空间压缩,是一种拿错误率换取空间的数据结构。

7. 应用
  适用范围:可进行数据的快速查找,判重,删除,通常来讲数据范围是int的10倍如下
  基本原理及要点:使用bit数组来表示某些元素是否存在,好比8位电话号码
  扩展:bloom filter能够看作是对bit-map的扩展

问题实例:
一、已知某个文件内包含一些电话号码,每一个号码为8位数字,统计不一样号码的个数。

8位最多99 999 999,大概须要99m个bit,大概10几M字节的内存便可。

二、在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。

方案1:采用2-Bitmap(每一个数分配2bit,00表示不存在,01表示出现一次,10表示屡次,11无心义)进行,共需内存232*2bit

=1GB内存,还能够接受。而后扫描这2.5亿个整数,查看Bitmap中相对应位,若是是00变01,01变10,10保持不变。所描完过后,查看bitmap,把对应位是01的整数输出便可。

参考

https://www.cnblogs.com/yangjiannr/p/da-shu-ju-chu-libitmap.html