位图的简单实现(bitMap)

一、位图的基本概念

位图法(bitmap)
作用: 判断某个数据存在不存在
适用范围:大规模数据,数据状态又不多
什么是位图: http://baike.sogou.com/v72576997.htm?fromTitle=位图法

所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。
例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示。那么就可以开一个int 数组,一个int有32个位,就可以表示32个人。操作的时候可以使用 位操作。

应用举例:
一、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中
申请512M的内存
一个bit位代表一个unsigned int值
读入40亿个数,设置相应的bit位
读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在
二、使用位图法判断整形 数组是否存在重复
三、使用位图法进行整形 数组排序
四、位图法存数据

二、代码块

#pragma once
#include
using namespace std;
#include 

class BitMap
{
public:
    BitMap() :_size(0)
    {}
    BitMap(size_t size) :_size(0)//构造函数的重载
    {
        _array.resize((size >> 5) + 1);//创建这么多int空间
    }
    void Set(size_t num)
    {
        size_t index = num >> 5;//获取数据在第几个字节
        size_t i = num % 32;//获取数据在第几个位

        //<< 左移往高位移 (相当于乘法)
        //>> 右移往低位移   (相当于除法)
        //左右移并不代表方向与大端或小端也没有关系

        if (_array[index] & (1 << i))//该数据已存在
        {
            return;
        }
        else
        {
            _array[index] |= (1 << i);
            _size++;
        }
    }
    void Reset(size_t num)//重置 把该位从 1-->0
    {
        size_t index = num >> 5;
        size_t i = num % 32;
        if (_array[index] & (1 << i))
        {
            _array[index] &= ~(1 << i);
            _size--;
        }
        else
        {
            return;
        }
    }
    void Test(size_t num)//测试该位是0 还是1 )(0:该数不存在,1:该数存在)
    {
        size_t index = num >> 5;
        size_t i = num % 32;

        if (_array[index] & (1 << i))
        {
            cout << num << "-->1 :值存在" << endl;
        }
        else
        {
            cout << num << "-->0 :值不存在" << endl;
        }
    }
protected:
    vector _array;
    size_t _size;//记录有效数据存在的个数
};

void BitMapTest()
{
    BitMap bm(62);
    bm.Set(1);
    bm.Set(5);
    bm.Set(33);
    bm.Set(92);
    bm.Set(888);

    bm.Reset(5);

    bm.Test(1);
    bm.Test(5);
    bm.Test(32);
    bm.Test(33);
    bm.Test(92);
    bm.Test(128);
    bm.Test(888);
}

你可能感兴趣的:(数据结构与算法)