昨晚遇到了一種很有意思的資料結構,bitmap
。
bitmap
,準確來說是基於位的對映。其中每個元素均為布林型(0 or 1),初始均為 false(0)。位圖可以動態地表示由一組無符號整數構成的集合。 每個bit對應乙個無符號數。如位圖第10個位元為true(1),表示無符號整數9。
之所以用位圖來表示整數,是為了節省記憶體。假如要處理50億個四位元組無符號整數,那麼需要5,000,000,000 * 4bytes = 20,000,000,000bytes = (20,000,000,000 / 1024 / 1024 / 1024)gb = 18.63gb
記憶體,顯然普通的計算機無法處理。如果使用位圖的話,每個位對映為乙個數,則只需要1bit * 5,000,000,000 = (5,000,000,000 / 8)bytes = (625,000,000 / 1024 / 1024)mb = 596mb
,需要的記憶體降到了1/32
。
如何由乙個整數k定位到指定位置?
思路是先定位到第k位元所在的位元組位置,然後在計算出它所在這個位元組的第幾位。
因為乙個位元組(char)佔8位,所以可以由k >> 3
算出第k位元所在位元組位置,這裡設找到的這個位元組位b
。
然後計算它所在8位位元組b
的第幾位,用k % 8
即可得到,寫成位運算k & 0x07
,獲得低三位所等價的數字,這裡設為x
。
定位到了指定位,如何修改它?
已經找到了第k位元在位元組b
的 第x
位。如果要將k新增進製圖,就需要將位元組b
的 第x
位設定為1,只需用乙個第x
位為1的位元組與位元組b
做或運算即可。構造這樣的位元組:0b1000_0000 >> x
(就是:0x80 >> (k & 0x07)
),就可以將位元組第x
為設為1。然後通過位運算|
,m[k >> 3] |= (0x80 >> (k & 0x07))
。完整的 bitmap c++**:
//**來自鄧俊輝資料結構習題集class bitmap
public:
bitmap(int n = 8)
bitmap(char* file, int n = 8)
~bitmap()
void set(int k)
void clear(int k)
bool test(int k)
void dump(char* file)
char* bits2string(int n)
void expand(int k)
};
應用:
可進行資料的快速查詢,判重,刪除。直接將整數k做位運算即可,複雜度為o(1)。
一道很有意思的題目
先列出 然後再開始解析 include stdafx.h include using namespace std class a class b public a void seta a data,int idx int tmain int argc,tchar argv for int i 0 i...
很有意思的SQL多行資料拼接
今天為了實現乙個很原始的問題上網查資料,見到乙個很有意思的sql語句,和大家分享一下 要實現的sql查詢很原始 要求從第乙個表進行查詢得到第二個 式的資料,上網查詢之後竟然能寫出下面的sql select from userino select from select usernames repla...
很有意思的SQL多行資料拼接
今天為了實現乙個很原始的問題上網查資料,見到乙個很有意思的sql語句,和大家分享一下 要實現的sql查詢很原始 要求從第乙個表進行查詢得到第二個 式的資料,上網查詢之後竟然能寫出下面的sql 複製 如下 如下 如下 實踐 表資訊 id name age address 1 張三 20 zhangsa...