給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。 【騰訊】
阿新 • • 發佈:2018-12-31
40億佔多少個位元組:4G
10個億需要1G
一個整型需要4個位元組,40億個則需要16G
由於如果我們直接使用這種方式去儲存需要16個G顯然這是不可能的,因此我們需要用到下面的方式去儲存,採用點陣圖
我們用一個Bit位去標識一個數存在還是不存在
我們都是到一般位元組是儲存的最小單位
那麼一個位元組有8個位,巧妙的利用這一點來實現我們的點陣圖
比如10我們先確定他存在第幾個位元組,再去確定它在第幾個位元組的第幾個位上
如果是40億個整型,那麼我們大概實際上需要多少個位元組?
我們由於一個整型採用一個位元組上的一個位就可以儲存。
#include<iostream>
#include<stdlib.h>
#include<vector>
using namespace std;
class BitMap
{
public:
BitMap(size_t range)
{
_bitmap.resize(range >> 3);
}
void Set(int num)
{
int index = num >> 3;//確定在第幾個位元組
int pos = num % 8;
_bitmap[index] |= 1 << pos;
}
void Reset(int num)
{
int index = num >> 3;
int pos = num % 8;
_bitmap[index] &= ~(1 << pos);
}
bool Test(int num)
{
int index = num >> 3;
int pos = num % 8;
return _bitmap[index] &= 1 << pos;
}
protected :
vector<char> _bitmap;
};
int main()
{
BitMap bm(-1);
bm.Set(10);
bm.Set(10555);
bm.Set(12222);
bm.Set(16666);
bm.Reset(10);
cout<<bm.Test(10)<<endl;
cout<<bm.Test(10555)<<endl;
cout<<bm.Test(12222)<<endl;
cout<<bm.Test(16666)<<endl;
system("pause");
return 0;
}
很明顯我們的點陣圖的確是節省了大量的空間,但是點陣圖也有它的缺點,它只能處理整型的資料。