簡單易懂的BitMap演算法

2021-08-18 15:15:56 字數 1240 閱讀 4029

面試題經常會有類似給很大的一堆連續的,不重複的無符號整數(如10億個整數),而且是無序的,然後希望以後能頻繁快速的查詢某個數字是否出現在這些數字中。

a) 一開始如果我們先假設不考慮記憶體需求,由於要頻繁快速的查詢數字是否存在,所以對這些數字進行排序進行二分明顯是不符合要求,查詢最快就是類似hash,這道題可以直接用unordered_map去做,只需要一次對10億個整數做預先處理,即可馬上得到該數數否存在10億個數字中。

b) 但是一旦考慮到記憶體需求,在單機上一般來說是不可行的(假設記憶體為4g),10億個數字=1000000000個數字->4000000000位元組->4000000kb->4000mb->4g. 不過值得高興的是,bitmap演算法可以幫助我們解決這個問題,直接通過位來判斷某個數字是否存在,即乙個位表示乙個數字,這裡我們用char,乙個char為8位,即可以表示8個數字,10億個數字即10億除以8= 125000000個char ,即125mb。

c) 給乙個數字,怎麼進行置位和判斷尼,非常簡單,第乙個char表示1-8,第二個char表示9-16,以此類推,首先因為是無符號數,所以數字必然是大於等於1,所以給定乙個數字需要先對其減一。然後我們讓每個給定數字(-1)先除於8,得到第index個char,然後計算偏移讓數字(-1)%8,即可知道該數字對應的是第幾個char的第幾個位。搜尋也是一樣。

**如下

//// main.cpp

// bitmap_find_num

//// created by wb on 2018/4/12.

//#include

#include

using

namespace

std;

#define max 1000000000/8

/* 通過設定位來保證number是存在的

查詢的時候直接判斷該位是否為1即可

*/class qq_num;

void qq_num::init()

void qq_num::insert(unsigned

int number)

else

}int main(int argc, const

char * argv) {

qq_num q;

q.init();

q.insert(100);

cout

<100)<101)《另外,對除法跟求mod進行優化,因為除以8,其實就是對數字向右偏移8位, 對8取模,就是讓數字&7即可得到該數字。

Bit Map演算法的簡單實現

bitmap的定義 所謂的bit map就是用乙個bit位來標記某個元素對應的value,而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。使用bitmap實現8位 號碼的儲存,能夠實現 號碼的插入 刪除 查詢。使用bitmap演算法。8位 號碼總共有0 999...

匈牙利演算法(簡單易懂)

匈牙利演算法為一種二分圖最大匹配的指派演算法,在多目標跟蹤中比較常用,以下是工程化的匈牙利演算法步驟 step1.將元素排列成為矩陣,列為被指派物件,行為匹配權重 step2.將矩陣補齊為m m的方陣,補的元素為原始矩陣中的最大值 step3.找出每行的最下元素a1,a2.an,然後每行的所有元素分...

kmp演算法 簡單易懂

kmp字串 給定乙個模式串s,以及乙個模板串p,所有字串中只包含大小寫英文本母以及阿拉伯數字。模板串p在模式串s中多次作為子串出現。求出模板串p在模式串s中所有出現的位置的起始下標。輸入格式 第一行輸入整數n,表示字串p的長度。第二行輸入字串p。第三行輸入整數m,表示字串s的長度。第四行輸入字串s。...