本篇是大資料演算法系列第一篇《bitmap的原理和實現》,bitmap 的思想的和原理是很多演算法的基礎,因此我們以bitmap開篇。
既然是說大資料演算法,我們先嘗試給大資料演算法乙個定義,或者說是限定一下這個系列的範圍。
大資料演算法:在給定的資源約束下,以大資料為輸入,在給定時間約束內可以計算出給定問題加過的演算法。大資料演算法會有傳統的演算法有不一樣的地方:
資源有約束
時間有約束
大資料作為輸入
不一定是精確演算法
前三點可以看作是對演算法的要求,第四點可以看作是在大資料場景下演算法可以做出的讓步。比如說在10億的資料中求count distinct
操作,完全精確的演算法會十分占用空間資源,而且也很難在快速計算出結果。如果這時候允許一定的誤差,就可以在極短的時間使用少量的內容算出結果,比如基數估計演算法中的hyperloglog。
本系列會包括 bitmap、roaring bitmap、bloom filter、counting bloom filter、linear counting、loglog counting、hyperloglog counting 等演算法。我會把這些演算法乙個個過一遍,看**、寫**、整理學習筆記。
對於技術人員來講,文章應該做到**碼並茂,因此我會盡量做到每篇文章都有原理說明和示例**的實現,原理說明會通過配圖的方式來理解,**的話會有乙個比較簡單的demo。
bitmap 的基本原理就是用乙個 bit 來標記某個元素對應的 value,而 key 即是該元素。由於採用一 個bit 來儲存乙個資料,因此可以大大的節省空間。
我們通過乙個具體的例子來說明 bitmap 的原理,假設我們要對 0-31 內的 3 個元素 (10, 17,28) 排序,那麼我們就可以採用 bitmap 方法(假設這些元素沒有重複)。
如下圖,要表示 32 個數,我們就只需要 32 個 bit(4bytes),首先我們開闢 4byte 的空間,將這些空間的所有 bit 位都置為 0。
然後,我們要新增(10, 17,28) 這三個數到 bitmap 中,需要的操作就是在相應的位置上將0置為1即可。如下圖,比如現在要插入 10 這個元素,只需要將藍色的那一位變為1即可。
將這些資料插入後,假設我們想對資料進行排序或者檢索資料是否存在,就可以依次遍歷這個資料結構,碰到位為 1 的情況,就當這個資料存在。
bitmap 也可以用來表述字串型別的資料,但是需要有一層hash對映,如下圖,通過一層對映關係,可以表述字串是否存在。
當然這種方式會有資料碰撞的問題,但可以通過 bloom filter 做一些優化。
懂原理之後,還是要寫**來加深一下理解,這裡用 python 實現乙個最基本的版本。
**用到了 bitarry 庫來直接操作 bit 陣列;用 hashlib 來將字串對映到數字,以便插入 bitmap。
**很簡單,看懂上面的原理的話,很容易就看懂了**。
bitmap 的使用場景很廣泛,比如說 oracle、redis 中都有用到 bitmap。當然更多的系統會有比 bitmap 稍微複雜一些的演算法,比如 bloom filter、counting bloom filter,這些會在後面逐一展開。
下面舉乙個在演算法中用到 bitmap 來解決問題的例子。
已知某個檔案內包含一些**號碼,每個號碼為8位數字,統計不同號碼的個數。在這裡就不再做和其它演算法的對比,直接說一下 bitmap 的思路。
8 位的整數,相當於是範圍在(0,99999999),也就是說 99999999 個 bit,也就是 12m 左右的記憶體,比起用類似 hashmap 的方式的話能節省很大的空間。 可以理解為從0 到 99999999 的數字,每個數字對應乙個 bit位,所以只需要 12m 左右的記憶體表示了所有的 8 位數的**。
查詢的時候就很簡單了,直接統計有多少位是 1 就可以了。
bitmap 的思想在面試的時候還是可以用來解決不少問題的,然後在很多系統中也都會用到,算是一種不錯的解決問題的思路。
但是 bitmap 也有一些侷限,因此會有其它一些基於 bitmap 的演算法出現來解決這些問題。
個人主頁:
大資料處理 Bitmap
mapreduce是一種程式設計模型,用於大規模資料集 大於1tb 的並行運算。概念 map 對映 和 reduce 歸約 bit map空間壓縮和快速排序去重 1.bit map的基本思想 32位機器上,對於乙個整型數,比如int a 1 在記憶體中佔32bit位,這是為了方便計算機的運算。但是對...
Bit map法處理大資料問題
問題引入 1.給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中?2.給定乙個千萬級別資料量的整數集合,判斷哪些是重複元素。3.給定乙個千萬級別資料量的整形陣列,對其進行排序。4.在5億個整數中找出不重複的整數 注意,假設記憶體不足...
Python 實現Bitmap資料演算法
試想乙個問題,乙個陣列長度10億,查詢某乙個數字是否在其中,怎麼計算?首先常規的查詢演算法不能直接用了,這就需要用上我們的bitmap演算法了。什麼是bipmap演算法呢?假如在8位的電腦中 懶的打0 就不舉例32位的電腦 數字1 在計算機的表示為00000001,數字5在計算機中為00000101...