第三部分 海量資料處理之 Bti map 詳解

2021-06-27 02:36:28 字數 2145 閱讀 5433

本文接下來著重闡述 bit-map。

什麼是 bit-map

所謂的 bit-map 就是用乙個 bit 位來標記某個元素對應的 value,而 key 即是該元素。
由於採用了 bit 為單位來儲存資料,因此在儲存空間方面,可以大大節省。

假設我們要對 0-7內的5個元素(4,7,2,5,3)排序(這裡假設這些元素沒有重複)。
那麼我們就可以採用bit-map 的方法來達到排序的目的。要表示8個數,我們就只需要8個 bit(1bytes),

首先我們開闢1byte 的空間,將這些空間的所有bit位都置為 0(如下圖:) 

然後遍歷這5個元素,首先第乙個元素是 4,那麼就把 4對應的位置為 1(可以這樣操作  p+(i/8)|(0×01<

當然了這裡的操作涉及到 big-ending 和 little-ending 的情況,這裡預設為 big-ending),因為是從零開始的,

所以要把第五位置為一(如下圖):

然後再處理第二個元素 7,將第八位置為 1,,接著再處理第三個元素,

一直到最後處理完所有的元素,將相應的位置為 1,這時候的記憶體的bit位的狀態如下:

然後我們現在遍歷一遍bit 區域,將該位是一的位的編號輸出(2,3,4,5,7),

這樣就達到了排序的目的。下面的**給出了乙個 bitmap 的用法:排序。

//定義每個 byte 中有 8 個 bit 位 

#includeusing namespace std;

#include#define bytesize 8

void setbit(char *p, int posi)

void bitmapsortdemo()

; //bufferlen 這個值是根據待排序的資料中最大值確定的

//待排序中的最大值是 14,因此只需要 2個 bytes(16個bit) 。

const int bufferlen=2;

char *pbuffer = new char[bufferlen];

//要將所有的 bit 位置為 0,否則結果不可預知。

memset(pbuffer,0,bufferlen);

for(int i=0;i<9;i++)

//輸出排序結果

for(int i=0;i使用 bit 陣列來表示某些元素是否存在,比如 8 位**號碼擴充套件

bloom filter 可以看做是對 bit-map 的擴充套件(關於 bloom filter,請參見: 海量資料處理之 bloom
filter 詳解)。 

問題例項

1)已知某個檔案內包含一些**號碼,每個號碼為 8 位數字,統計不同號碼的個數。 

8位最多 99 999 999,大概需要 99m 個 bit,大概 10 幾 m 位元組的記憶體即可。
(可以理解為從 0- 99999999 的數字,每個數字對應乙個 bit 位,所以只需要 99m個bit==1.2mbytes,

這樣,就用了小小的1.2m 左右的記憶體表示了所有的 8 位數的**)

2)2.5 億個整數中找出不重複的整數的個數,記憶體空間不足以容納這 2.5 億個整數。

將 bit-map 擴充套件一下,用 2bit 表示乙個數即可,0 表示未出現,1 表示出現一次,2 表示出現 2 次及以上,

在遍歷這些數的時候,如果對應位置的值是 0,則將其置為 1;如果是

1,將其置為 2;如果是 2,則保持不變。

或者我們不用 2bit 來進行表示,我們用兩個 bit-map

即可模擬實現這個 2bit-map,都是一樣的道理。

劇本第三部分

第三部分劇本 場景一 女生宿舍,a趴在桌子上睡覺,電腦螢幕亮著,是vs 但是就寫了一行 小碼趴在a的胳膊上睡著。突然,a醒了,發現自己上課要遲到了,a 哎呀,完了完了,大中午的怎麼趴在這睡著了 邊說話邊收拾書包 轉頭看向小碼 a 把你放哪呢 說話的時候四周環視 算了,跟我去吧,我先把你放書包裡 說話...

第三部分 效能

索引管理 效能優化 效能監控 db.c1.find explain 查詢的詳細資訊列出來 db.c1.getindexkyes 所有索引的字段 db.c1.getindexes 所有索引的相關資訊 2 唯一索引 只需要在ensureindex命令中提定 uniqure true 即可建立唯一索引,如...

sqlalchemy第三部分

1.復用。在我們用sqlalchemy運算元據庫時,有部分 可以重複使用,我們將這部分放到乙個模組中,後面使用就可以呼叫這個模組,匯入裡面的方法。python 1.連線資料庫 from sqlalchemy import create engine hostname 127.0.0.1 ip位址 p...