位图的实现以及位图的应用

位图就是用每一个bit位来存储某种状态,适用于大规模数据且数据状态不多的情况。通常用来判断一个数据是否存在。

#include<iostream>
#include<vector>
using namespace std;
class BitMap
{
public:
    BitMap()
    {}
    BitMap(size_t size)
    {
        _table.resize((size>>5) + 1);
    }
    void Set(int val)//将对应bit位置1--等同于插入一个元素
    {
        size_t byteNo = val >> 5;//在哪个字节
        size_t bitNo = val % 32;//在哪个bit位
        _table[byteNo] |= (1 << bitNo); //置1
    }
    void Reset(int val)//将对应bit位置0--等同于删除一个元素
    {
        size_t byteNo = val >> 5;
        size_t bitNo = val % 32;
        _table[byteNo] &= ~(1 << bitNo);//置0
    }
    bool Test(int val)
    {
        size_t byteNo = val >> 5;
        size_t bitNo = val % 32;
        if ((1 << bitNo)&_table[byteNo])
        {
            return true;
        }
        else
        {
            return false;
        }
    }
private:
    vector<int> _table;
};
void FunTest()
{
    BitMap bm(100);
    bm.Set(30);
    bm.Set(65);
    bm.Set(66);
    bm.Set(26);
    bm.Set(15);
    bm.Set(23);
    bm.Set(2);
    bm.Set(47);
    cout<<bm.Test(15)<<endl;
    cout<<bm.Test(20)<<endl;
}

位图相关应用:
1、给定100亿个整数,设计算法找到只出现一次的整数。
我们可以将这100亿个整数拆分成1000份文件,在每一份文件中使用位图,用两个bit位来存储一个数据的状态,00:出现0次,01:出现1次,10:出现多次,11:舍弃。再将1000份文件中只出现一次的数据保存至一个文件中即可。
2、给两个文件,分别有100亿个整数,我们只有1G内存,找到两个文件交集 。
所有整数共2^32种可能,每个数据用两个bit位表示,共需要2^32*2/8 = 1GB内存,00:两个文件均没出现,10:文件1出现过,01:文件2出现过,11:两文件均出现过,遍历两个文件中的所有整数,然后寻找位图中11对应的整数即是两个文件的交集。
3、1个文件有100亿个int,1G内存,找到出现次数不超过2次的所有整数 。
与问题1类似:我们可以将这100亿个整数拆分成1000份文件,在每一份文件中使用位图,用两个bit位来存储一个数据的状态,00:出现0次,01:出现1次,10:出现两次,11:舍弃。再将1000份文件中出现次数不超过两次的数据保存至一个文件中即可。
4、给两个文件,分别有100亿个query,我们只有1G内存,找到两个文件交集。
hash分桶法:将两个文件分别切分为1000份,每个文件相同的query会进入编号相同的文件(哈希算法会将query转换为整型,对应下标index=query/1000);依次将相同编号的小文件加载到内存进行比较;找出交集。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值