海量数据处理--位图(BitMap)
對于海量數(shù)據(jù)這個詞,大家不難理解吧。主要是針對給定的數(shù)據(jù)量特別大,占用內(nèi)存特別大的情況。那么和位圖有什么關(guān)系呢。看下面一個騰訊的海量數(shù)據(jù)的例子吧。
例:給40億個不重復(fù)的無符號整數(shù),沒排過序。給一個無符號整數(shù),如何快速判斷一個數(shù)是否在這40億個數(shù)中。
?????? 對于這道題,我們給了40億個不重復(fù)的無符號整數(shù),一個整數(shù)是4個字節(jié),那么就是40*4=160億個字節(jié),大概是16G的內(nèi)存。顯然在內(nèi)存上時存不下的。那么我們怎么來查找呢。既然是不重復(fù),就說明整數(shù)要么就不出現(xiàn),要么就出現(xiàn)一次。整數(shù)的最大值是42億多,即2^32。此時我們就可以用每一位來表示這個數(shù)存在或者不存在。如果將32位為一個編號時,原本16G的數(shù)據(jù)使用位圖可以節(jié)省到500M的空間。大概我們剛剛學(xué)過哈希表,用訪問地址的方法來快速的查找出地址對應(yīng)的值。這里也一樣,用到了哈希表中的新的解決海量數(shù)據(jù)的方法---位圖。
那么問題來了?什么是位圖呢?
我們用每一位標(biāo)志這個數(shù)存在的狀態(tài),設(shè)為0(不存在)和1(存在);
位圖的基本結(jié)構(gòu):
是一個size_t類型的vector數(shù)組;
vector<size_t> _array;
位圖的基本函數(shù):
對于判斷一個無符號整數(shù),是否存在這40億個數(shù)中。
(1)需要存入這40億個數(shù),使用Set將對應(yīng)的40億個位置為1;
(2)使用Test將判斷某個位是否為0或1;
注:位圖只是考慮了整數(shù)類型
位圖的實(shí)現(xiàn)代碼:(vs2013)
#pragma once #include<iostream> using namespace std; #include<vector>//位圖的每一位的0,1標(biāo)志這個數(shù)存在或不存在的狀態(tài) class BitMap { public:BitMap(size_t Size = 1024){_array.resize(Size/32+1);}~BitMap(){}public://將這個數(shù)存在的狀態(tài)置為1void Set(const size_t& value){size_t index = value>>5;size_t bit = value % 32;_array[index] |= (1<<bit);}//將這個數(shù)不存在的狀態(tài)置為0void Reset(const size_t& value){size_t index = value>>5;size_t bit = value % 32;_array[index] &= (~(1<<bit));}//測試某個數(shù)是否出現(xiàn)過bool Test(const size_t& value){size_t index = value>>5;size_t bit = value % 32;return (_array[index] & (1<<bit));} private:vector<size_t> _array; };void BitMapTest() {BitMap bm(size_t(-1)); //64位系統(tǒng)下表示的整數(shù)的最大值bm.Set(10);bm.Set(100);bm.Set(20);bm.Set(500);cout<<bm.Test(10)<<endl;cout<<bm.Test(200)<<endl;cout<<bm.Test(500)<<endl;cout<<bm.Test(40)<<endl; }
運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的海量数据处理--位图(BitMap)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DNF鬼泣和女漫。纯刷图。无高强。
- 下一篇: 八两金剧情介绍