(算法)位图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; }