什麼叫位圖?
位圖,就是用一塊內存區域的每一個比特位表示一個對象的數據結構。
叫做 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);
}