zoukankan      html  css  js  c++  java
  • (算法)位图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;
    }
  • 相关阅读:
    C++处理Json串——jsoncpp库
    古典文学--本经阴符七术
    古典文学--素书
    网络编程之getaddrinfo
    网络编程之addrinfo
    跳表数据结构
    MySQL 编译安装并且开启DEBUG模式
    volatile关键字详解
    istringstream、ostringstream、stringstream 类简介
    Selenium入门21 Select操作
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4790032.html
Copyright © 2011-2022 走看看