位图法-bitmap

简介: 来源:http://www.cnblogs.com/pangxiaodong/archive/2011/08/14/2137748.html 1. 简述     昨天在看海量数据处理的题目,其中有一道题用的就是2-bitmap,今天学习一下bitmap,主要参考资料就是百度百科。

来源:http://www.cnblogs.com/pangxiaodong/archive/2011/08/14/2137748.html

1. 简述

    昨天在看海量数据处理的题目,其中有一道题用的就是2-bitmap,今天学习一下bitmap,主要参考资料就是百度百科。

2. 定义

    bitmap是通过1个位表示一个状态,比如:int类型有2^32个数字,即4G个数字,那么每个数字一个状态,就是2^32个bit,即512 MB。

3. 应用

    · 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中
  首先,将这40亿个数字存储到bitmap中,然后对于给出的数,判断是否在bitmap中即可。
    · 使用位图法判断整形数组是否存在重复
      遍历数组,一个一个放入bitmap,并且检查其是否在bitmap中出现过,如果没出现放入,否则即为重复的元素。
    · 使用位图法进行整形数组排序
      首先遍历数组,得到数组的最大最小值,然后根据这个最大最小值来缩小bitmap的范围。这里需要注意对于int的负数,都要转化为unsigned int来处理,而且取位的时候,数字要减去最小值。
    · 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数
      参考的一个方法是:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)。其实,这里可以使用两个普通的Bitmap,即第一个Bitmap存储的是整数是否出现,如果再次出现,则在第二个Bitmap中设置即可。这样的话,就可以使用简单的1-Bitmap了。

4. 实现 

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 #define  MAX  536870912 // pow(2,29)
 6 unsigned char bitmap[(unsigned int)MAX];
 7 
 8 void init() 
 9 {
10   memset(bitmap, 0, MAX*sizeof(unsigned char)); 
11 }
12 void set(unsigned int num) 
13 {
14   bitmap[num/8] |= (128 >> num%8); // pow(2,7)=128
15 }
16 bool find(unsigned int num) 
17 {
18   return bitmap[num/8] & (128 >> num%8);
19 }
20 int main() 
21 {
22   init();
23   for(int i=-10; i<=10; i++)
24     set(i);
25   for(int i=-20; i<=20; i++)
26     if(find(i))
27       cout << "i: " << i << endl; 
28   return 0;
29 }

 

 对于实现来说,百科上面的代码用的是int数组,不过char数组应该也是一样的,就是相当于数组长度大了点,差不多。对于unsigned int,主要是在除法和取余运算上的问题,因此要保证set和find函数中使用的一定是unsinged int类型,即要被强制转化的参数。

5. 备注

   普通bitmap的局限就是要求所有的状态都要放在内存里面,假设状态数量是2^64的话,那么内存肯定放不下,或者状态数量不变为2^32,但是内存要求10MB的话,就没法办了。另外好像有bitmap+mapreduce的方法,这个以后有机会再研究。

6. 参考

    十道海量数据处理面试题与十个方法大总结    http://blog.csdn.net/v_JULY_v/article/details/6279498
    位图法_百度百科    http://baike.baidu.com/view/6102616.html?tp=5_11

 

相关文章
|
16天前
|
存储 Java
Bitmap位图(Java实现)
本文介绍了使用Java实现一个简单的Bitmap,通过自定义byte数组存储数据,提供put和exist方法分别用于插入数据和查询数据是否存在。Bitmap利用位操作高效地管理大量布尔值,适用于空间优化的场景。代码中详细解释了位图的核心原理、方法实现及边界检查。后续计划探讨位图在海量数据去重中的应用及JDK BitSet源码分析。
37 7
|
2月前
|
存储 监控
Bitmap
【10月更文挑战第7天】
33 1
|
5月前
|
存储 算法 数据挖掘
【C++】位图
【C++】位图
50 1
|
6月前
|
C++
位图和布隆过滤器:位图
位图和布隆过滤器:位图
|
6月前
|
API Android开发
55. 【Android教程】位图:Bitmap
55. 【Android教程】位图:Bitmap
73 0
|
6月前
|
存储 算法 Java
BitMap介绍
BitMap介绍
33 0
|
存储 安全 索引
Bitmaps(位图)
什么是 Bitmaps Bitmaps 并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M,最适合设置成2^32个不同字节。 Bitmaps 的最大优势之一在存储信息时极其节约空间。例如,在一个以增量用户ID来标识不同用户的系统中,记录用户的四十亿的一个单独bit信息(例如,要知道用户是否想要接收最新的来信)仅仅使用512M内存。
 Bitmaps(位图)
|
存储 NoSQL Redis
Bitmaps-位图
Bitmaps-位图
158 0
Bitmaps-位图
使用Bitmap.createBitmap遇到的问题
使用Bitmap.createBitmap遇到的问题
457 0
|
Java Android开发
Bitmap详解
Bitmap的分析与使用 Bitmap的创建 创建Bitmap的时候,Java不提供new Bitmap()的形式去创建,而是通过BitmapFactory中的静态方法去创建,如:BitmapFactory.
2105 0