本文接下來著重闡述 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...