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

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

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; }

很明顯我們的點陣圖的確是節省了大量的空間,但是點陣圖也有它的缺點,它只能處理整型的資料。