BitSet位图

腾讯面试题:

  给40亿个无符号整形的不重复的数据,如何迅速判断一个数是否在这40亿个数中。

分析:40亿个数据实在太多并且不重复,并且我们不必知道这些数据的大小,只需标记这些数是否存在。因此我们可以想到用位图来解决这个问题,这样只需占大概500M的内存空间。实现方法如下:

#pragma once
#include<vector>

class BitMap
{
public:
    BitMap()
    {}

    BitMap(size_t n)
    {
        _bitMap.resize((n >> 5) + 1);
    }


    void set(size_t x)   //把位置1
    {
        size_t index = x >> 5;    //index表示的是占用的是第几个字符
        size_t num = x % 32;     //num表示的是占用字符中的第几个位置
        _bitMap[index] |= (1 << num);     //将num所指的位置为1
    }
    void reset(size_t x)     //把位置0
    {
        size_t index = x >> 5;
        size_t num = x % 32;
        _bitMap[index] &= (~(1 << num));    //将num所指的位置为0
    }
    bool Test(size_t x)     //测试某一位是0还是1
    {
        size_t index = x >> 5;
        size_t num = x % 32;
        return _bitMap[index] & (1 << num);
    }
private:
    vector<size_t> _bitMap;
};

 

void test()   //测试
{
    BitMap bm1(500);
    bm1.set(4);
    bm1.set(44);
    bm1.set(444);

    bm1.reset(44);
    cout<<bm1.Test(444)<<endl;
    cout<<bm1.Test(23)<<endl;
}

posted @ 2016-11-05 23:25  请叫我小小兽  阅读(206)  评论(0编辑  收藏  举报