演算法系列 bitmap演算法詳解和實現

2021-09-19 04:14:45 字數 2296 閱讀 9966

我們可以將bitmap看成是一種資料結構,所謂的bit-map就是用乙個(或幾個)bit位來標記某個元素對應的state(value)。最基本的情況,使用1bit標示乙個關鍵字的狀態(可標示兩種狀態),但根據需要也可以使用2bit(標示4種狀態),3bit(標示8種狀態),當乙個狀態標示需要的位數達到32bit時,就演變成來乙個整型陣列了。

優點:由於採用了bit為單位來儲存資料並建立對映關係來查詢位置,因此可以大大減少儲存空間,加快在大量資料中查詢的時間。(有點雜湊表的意思,但雜湊中的value值資料型別可以豐富多樣,而bitmap最終查到的value只能表示簡單的幾種狀態)

缺點:bitmap中的查詢結果(value)能表達的狀態有限,且所有的資料不能重複。即不可對重複的資料進行排序和查詢。

在真實專案中,我們是反感重複造輪子的,能使用穩定現成且開源的是最好,在一般情況下(不用筆試面試的時候),c++庫中已經提供了bitmap容器(是一種位集合的容器,和普通陣列一樣使用即可,本質是乙個模板類),以下是利用bitset容器實現簡單的位圖法排序

#include 

#include

#include

using

namespace

std;

const

unsigned

int max_num = 20000; //最大數字

void

bitmapsort(vector

int>& r)

int

main()

;

bitmapsort(r);

for (auto x : r)

cout

<< x << " ";

cout

<< endl;

}

或者在筆試或者面試中我們可以自己實現乙個簡易版的bitmap類

#include

#include

#pragma once

using

namespace

std;

class

bitmap

//按照點陣圖的方式進行數值的置位

void

setmap(size_t v)

//進行數值的復位

void

retsetmap(size_t v)

//給定乙個數,測試這個數是否在

bool

testmap(size_t v)

protected:

vector

_bm;

};

此題解法:建立乙個位集合,全部初始化為0。遍歷40億個不重複的整數,通過上述提供的一種對映(每個不重複的整數對映到給定的位)找到其位的位置,標記為1。判斷這個數是否在大整數集合中,即通過對映關係計算此整數的位位置,檢查是否為1,若為1,則存在,若為0,則不存在

此題解法:其實就是不重複的任意7位數及其之內的排序問題。我們用1位來表示**是否出現,遍歷整個**號序列,設定相應的位,遍歷位圖收集位被設定的號碼即可。檢視上述的實現**

5.擴充套件:對於上述問題,每個**號碼最多出現一次,如果關鍵字可能多次重複出現,但關鍵字範圍比較確定且很集中的情況下,也可使用位圖(要求的條件比較苛刻)(根據關鍵字最多可能出現的次數確定每個關鍵字需要的位數),但此時的點陣圖通常會是乙個整型陣列,陣列內容為對應位置關鍵字出現的次數,在執行收集過程時,對於每個關鍵字要收集多次(根據陣列的值確定)。如有一大批職工的年齡資訊,需要對這些職工按照年齡資訊進行排序,則只需要建立乙個長度為100的陣列,每個陣列為對應年齡人的個數,掃瞄一遍陣列,收集年齡資訊即可。

經典演算法系列之 一 BitMap

一 問題引入 bitmap從字面的意思,很多人認為是點陣圖,其實準確的來說,翻譯成基於位的對映,怎麼理解呢?舉乙個例子,有乙個無序有界int陣列,初步估計占用記憶體44 16位元組,這倒是沒什麼奇怪的,但是假如有10億個這樣的數呢,10億4 1024 1024 1024 3.72g左右。如果這樣的乙...

經典演算法系列之 一 BitMap

一 問題引入 bitmap從字面的意思,很多人認為是點陣圖,其實準確的來說,翻譯成基於位的對映,怎麼理解呢?舉乙個例子,有乙個無序有界int陣列,初步估計占用記憶體44 16位元組,這倒是沒什麼奇怪的,但是假如有10億個這樣的數呢,10億4 102410241024 3.72g左右。如果這樣的乙個大...

BitMap演算法詳解

所謂的bitmap就是用乙個bit位來標記某個元素所對應的value,而key即是該元素,由於bitmap使用了bit位來儲存資料,因此可以大大節省儲存空間。基本思想 這此我用乙個簡單的例子來詳細介紹bitmap演算法的原理。假設我們要對0 7內的5個元素 4,7,2,5,3 進行排序 這裡假設元素...