大数据处理技术之BitMap
沉沙 2018-09-21 来源 : 阅读 2196 评论 0

摘要:本篇教程探讨了大数据处理技术之BitMap,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入。

本篇教程探讨了大数据处理技术之BitMap,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入。

<

一:简介
所谓的BitMap就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了bit为单位来存储数据,因此在存储空间方面,可以大大节省。
二:基本思想
我们用一个具体的例子来讲解,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用BitMap的方法来达到排序的目的。要表示8个数,我们就只需要8个bit(1Bytes)。 
(1)首先我们开辟1字节(8bit)的空间,将这些空间的所有bit位都置为0,如下图:
(2)然后遍历这5个元素,首先第1个元素是4,那么就把4对应的位置为1,因为是从零开始的,所以要把第5个位置为1(如下图):
然后再处理第2个元素7,将第8个位置为1,,接着再处理第3个元素,一直到处理完所有元素,将相应的位置为1,这时候的内存的bit位的状态如下: 
(3)然后我们现在遍历一遍bit区域,将该位是1的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。
算法思想比较简单,但关键是如何确定十进制的数映射到二进制bit位的map图。
三:Map映射
假设需要排序或者查找的总数N=10000000。 
BitMap中1bit代表一个数字 
1个int = 4Bytes = 4*8bit = 32 bit,那么N个数需要N/32 int空间。所以我们需要申请内存空间的大小为int a[1 + N/32],其中:a[0]在内存中占32为可以对应十进制数0-31,依次类推: 
BitMap表为: 
    a[0]  --------->  0-31 
    a[1]  --------->  32-63 
    a[2]  --------->  64-95 
    a[3]  --------->  96-127 
    .......... 
那么十进制数如何转换为对应的bit位,下面介绍用位移将十进制数转换为对应的bit位。
申请一个int一维数组,那么可以当作为列为32位的二维数组。
a[0] 
a[1] 
a[2] 
a[3]
a[i] ……………………………….
a[n]
例如: 
十进制1 在a[0]中,位置如下图: 
 
十进制31 在a[0]中,位置如下图: 
 
十进制32 在a[1]中,位置如下图: 
 
十进制33 在a[1]中,位置如下图: 
通过上图分析得出通过以下几步将十进制数如何转换为对应的bit位:
(1)求十进制数在对应数组a中的下标
十进制数0-31,对应在数组a[0]中,32-63对应在数组a[1]中,64-95对应在数组a[2]中……… 
分析得出:对于一个十进制数n,对应在数组a[n/32]中 
例如n=11,那么 n/32=0,则11对应在数组a中的下标为0,n=32,那么n/32=1,则32对应在数组a中的下标为1,n = 106,那么n/32 = 3,则106对应数组a中的下标为3。
(2)求十进制数在对应数组a[i]中的下标
例如十进制数1在a[0]的下标为1,十进制数31在a[0]中下标为31,十进制数32在a[1]中下标为0。 
在十进制0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得在对应数组a[i]中的下标。 
分析得出:对于一个十进制数n,对应在数组a[n/32][n%32]中
(3)移位
对于一个十进制数n,对应在数组a[n/32][n%32]中,但数组a毕竟不是一个二维数组,我们通过移位操作实现置1。  
a[n/32]  |= 1 << n % 32 
移位操作: 
a[n>>5] |= 1 << (n & 0x1F)
n & 0x1F 保留n的后五位  相当于 n % 32 求十进制数在数组a[i]中的下标
/*--------------------------------
*   日期:2015-02-07
*   作者:SJF0115
*   题目: BitMap
*   文章:
------------------------------------*/
#include <iostream>
#include <vector>
using namespace std;
#define N 1000000000
//申请内存的大小
int a[1 + N/32];
// 设置所在的bit位为1
void BitMap(int n){
    // row = n / 32 求十进制数在数组a中的下标
    int row = n >> 5;
    // n & 0x1F 保留n的后五位
    // 相当于 n % 32 求十进制数在数组a[i]中的下标
    a[row] |= 1 << (n & 0x1F);
}
// 判断所在的bit为是否为1
bool Exits(int n){
    int row = n >> 5;
    return a[row] & ( 1 << (n & 0x1F));
}
void Show(int row){
    cout<<"BitMap位图展示:"<<endl;
    for(int i = 0;i < row;++i){
        vector<int> vec;
        int tmp = a[i];
        for(int i = 0;i < 32;++i){
            vec.push_back(tmp & 1);
            tmp >>= 1;
        }//for
        cout<<"a["<<i<<"]"<<"->";
        for(int i = vec.size()-1;i >= 0;--i){
            cout<<vec[i]<<" ";
        }//for
        cout<<endl;
    }//for
}
int main(){
    int num[] = {1,5,30,32,64,56,159,120,21,17,35,45};
    for(int i = 0;i < 12;++i){
        BitMap(num[i]);
    }//for
    int row = 5;
    Show(5);
    /*if(Exits(n)){
        cout<<"该数字已经存在"<<endl;
    }//if
    else{
        cout<<"该数字不存在"<<endl;
    }//else*/
    return 0;
}
应用范围
可以运用在快速查找、去重、排序、压缩数据等。
扩展
Bloom filter可以看做是对BitMap的扩展 

   

本文由职坐标整理发布,学习更多的大数据技术相关知识,请关注职坐标大技术云计算大技术技术频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 3 不喜欢 | 0
看完这篇文章有何感觉?已经有3人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程