一種很有意思的資料結構 Bitmap

2022-05-19 12:13:01 字數 1854 閱讀 8359

昨晚遇到了一種很有意思的資料結構,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...