(算法)位图BitMap

题目:

给定一数组,大小为M,数组中的数字范围为1-N,如果某带宽有限,无法传输该大小的数组,该怎么办?

思路:

通过位图BitMap来压缩数组,将数组中每个数字在bit位上标志,这样就可以将数组大小压缩很多倍,每个32位int只需要1bit来表示。

代码:

#include<iostream>
#include<string.h>

using namespace std;

char* compression(int *A,int imax,int n){
    int m=(imax-1)/8+1;
    //int bits[m]={0};
    char *bits=new char(m);
    memset(bits,0,m*sizeof(int));

    int byte_offset;
    int bit_offset;

    for(int i=0;i<n;i++){
        byte_offset=(A[i]-1)/8;
        bit_offset=7-(A[i]-1)%8;
        bits[byte_offset] |=1<<bit_offset;
    }

    for(int i=0;i<m;i++)
        cout<<int(bits[i])<<" ";
    cout<<endl;

    return bits;
}

void* depression(char *B,int m){
    //int n=m*8;
    //int *A=new int(n);

    for(int i=0;i<m;i++){
        for(int j=7;j>=0;j--){
            if((B[i]>>j)&1)
                cout<<i*8+8-j<<" ";
        }    
    }
    cout<<endl;
}

int main(){
    int A[]={1,3,7,9,4,6,8,10,16,20};
    int n=sizeof(A)/sizeof(A[0]);
    int imax=0;
    for(int i=0;i<n;i++){
        if(A[i]>imax)
            imax=A[i];
    }
    char *B;
    B=compression(A,imax,n);

    int m=(n-1)/8+1;
    depression(B,m);

    return 0;
}

 

posted @ 2015-09-07 21:42  AndyJee  阅读(511)  评论(0编辑  收藏  举报