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)。