數據結構--實現一個位圖

什麼叫位圖?

位圖,就是用一塊內存區域的每一個比特位表示一個對象的數據結構。
叫做 bitmap 或者 bitplane。

面試題

給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快
速判斷一個數是否在這40億個數中。 【騰訊】

我們來分析一下這個問題:40億個整數想要放到內存中勢必需要很大很大的空間,更何況要對40億個數據進行查找,那時間複雜度將會很大。
基於此,我們用位圖的方法的來存儲數據出現的次數,最後查找即可。

用int來舉例,一個int4個字節,所以有32個比特位。
這樣一個int便可以佔32個數字。
所以這樣子會大大的節省空間。
這裏寫圖片描述

實現位圖

#pragma  once

//位圖
#include <vector>
#include <iostream>
using namespace std;

class BitMap
{
public:
    BitMap()
    {}

    BitMap(size_t size)
    {
        //因爲是int 4個字節 32比特位
        //所以移5位,剛好32個比特位
            _table.resize((size >> 5) + 1);
    }

    void Set(int data)
    {
        //計算此數字在第幾個字節處(data / 32),第幾位(data % 32)
        //然後把第幾位置爲1 如果已經是1就不變
            size_t byteNo = data >> 5;
        size_t bitNo = data % 32;
        _table[byteNo] |= (1 << bitNo);
    }

    //恢復爲原來的
    void ReSet(int data)
    {
        size_t byteNo = data >> 5;
        size_t bitNo = data % 32;
        //這一位與0
        _table[byteNo] &= ~(1 << bitNo);
    }

    //檢查數字是否在其中
    bool Check(int data)
    {
            size_t byteNo = data >> 5;
            size_t bitNo = data % 32;

            //如果這一位左移 按位與 如果此時不爲0 則此數字存在
            if ((1 << bitNo)&_table[byteNo])
                return true;
            return false;
    }

private:
    vector<int> _table;
};

void Test()
{
    BitMap bp(1);
    bp.Set(0);
    bp.Set(1);
    bp.Set(2);
    bp.Set(3);
    bp.Set(4);
    bp.Set(5);
    bp.Set(6);
    bp.ReSet(3);
    cout << bp.Check(3);
    cout << bp.Check(7);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章