位图—海量数据的查找

为什么说位图是应用于海量数据的查找呢?

当数据不多时,我们要对一个数据进行查找,通常会用哈希表进行存储进行查找,但当数据很多时,显然对于内存有限的空间是不行的,例如说:
给定40亿个整数,要快速判断一个值是否在这其中?
40亿整数=40亿*4
而整数的范围为0到42亿9千万,内存是肯定不够的,那该如何处理呢?

所以有了位图这种方法:
我们存储一个整数要4个字节=32比特位,而我们要查找一个数在不在,可以不用将数据进行拷贝存储,只要将数据进行标识就行了,所以我们可以用一个比特位进行映射标识,在,就将一个对应bit置为1;不在,就将一个对应bit置为0,这样原本32位才能标识的一个数,用1bit就能标识,大大的节省了空间
这里写图片描述

#include<iostream>
#include<vector>
using namespace std;

class BitSet
{
public:
    //初始化开空间
    BitSet(size_t range)
    {
        _bits.resize((range >>5) + 1, 0);
    }
    //将数映射在位图上
    void Set(size_t x)
    {
        //找到对应位置
        size_t num = x >> 5;
        size_t pos = x % 32;
        //置为1,表示在这个位图中
        _bits[num] |=( 1 << pos);//将pos位置为1
    }
    void Reset(size_t x)
    {
        size_t num = x >> 5;
        size_t pos = x % 32;

        _bits[num] &=~( 1 << pos);//将pos位置为0
    }
    //测试某一个数在不在
    bool Test(size_t x)
    {
        size_t num = x >> 5;
        size_t pos = x % 32;

        return _bits[num] & (1 << pos);
    }
protected:
    vector<size_t> _bits;
};

void TestBitSet()
{
    BitSet bs(-1);//开整数最大空间,也可以将32个2相乘
    bs.Set(110);
    bs.Set(1);
    bs.Set(11000);
    bs.Set(300000);

    cout << bs.Test(1) << endl;//在:1
    cout << bs.Test(110) << endl;//1
    cout << bs.Test(5) << endl;//0
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/lindaxym/article/details/80295396
今日推荐