位图法-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

 

posted on   华山青竹  阅读(347)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
历史上的今天:
2014-07-09 C++输入输出流格式控制
2014-07-09 C(C++)输入输出格式
2014-07-09 P1010 笨小猴【tyvj】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示