[算法]bitmap算法
在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间。但hash table需要使用巨大的内存空间,显然在处理大数据时会显得力不从心。
bitmap可以有效地节省内存的使用,它的思想其实就是用1bit来代替一个index(通常是一个unsigned int)。
比如我要对{1,5,7,2}这四个byte类型的数字做排序,该怎么做呢?我们知道byte是占8个bit位,其实我们可以将数组中的值作为bit位的key,value用”0,1“来标识该key是否出现过?下面看图:
从图中我们精彩的看到,我们的数组值都已经作为byte中的key了,最后我只要遍历对应的bit位是否为1就可以了,那么自然就成有序数组了。
![](http://images0.cnblogs.com/blog/510104/201303/30162353-fba62860845142c99159c46e31b988de.png)
可能有人说,我增加一个13怎么办?很简单,一个字节可以存放8个数,那我只要两个byte就可以解决问题了。![]()
![](http://images0.cnblogs.com/blog/510104/201303/30162432-3db4c64866a7455cb21b314cd8cccce2.png)
(摘自:http://www.cnblogs.com/huangxincheng/archive/2012/12/06/2804756.html)
利用位操作,不难写出bitmap的置位、复位、判断、取反等操作。
置位:1左移i位与其相或
复位:1左移i位求反后与其相与
取反:1左移i位与其异或
因此,使用几个字节的bitmap作为hash table可以节省大量内存。