MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念"Map(映射)"和"Reduce(歸約)"html
1. Bit-map的基本思想
32位機器上,對於一個整型數,好比int a=1 在內存中佔32bit位,這是爲了方便計算機的運算。可是對於某些應用場景而言,這屬於一種巨大的浪費,由於咱們能夠用對應的32bit位對應存儲十進制的0-31個數,而這就是Bit-map的基本思想。Bit-map算法利用這種思想處理大量數據的排序、查詢以及去重。
Bitmap在用戶羣作交集和並集運算的時候也有極大的便利。算法
2. Bit-map應用之快速排序
假設咱們要對0-7內的5個元素(4,7,2,5,3)排序(這裏假設這些元素沒有重複),咱們就能夠採用Bit-map的方法來達到排序的目的。要表示8個數,咱們就只須要8個Bit(1Bytes),首先咱們開闢1Byte的空間,將這些空間的全部Bit位都置爲0,
編程
對應位設置爲1:數組
遍歷一遍Bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的,時間複雜度O(n)。
優勢:
運算效率高,不須要進行比較和移位;
佔用內存少,好比N=10000000;只需佔用內存爲N/8=1250000Byte=1.25M。
缺點:
全部的數據不能重複。即不可對重複的數據進行排序和查找。數據結構
3. Bit-map應用之快速去重
2.5億個整數中找出不重複的整數的個數,內存空間不足以容納這2.5億個整數。
首先,根據「內存空間不足以容納這2.5億個整數」咱們能夠快速的聯想到Bit-map。下邊關鍵的問題就是怎麼設計咱們的Bit-map來表示這2.5億個數字的狀態了。其實這個問題很簡單,一個數字的狀態只有三種,分別爲不存在,只有一個,有重複。所以,咱們只須要2bits就能夠對一個數字的狀態進行存儲了,假設咱們設定一個數字不存在爲00,存在一次01,存在兩次及其以上爲11。那咱們大概須要存儲空間幾十兆左右。
接下來的任務就是遍歷一次這2.5億個數字,若是對應的狀態位爲00,則將其變爲01;若是對應的狀態位爲01,則將其變爲11;若是爲11,,對應的轉態位保持不變。
最後,咱們將狀態位爲01的進行統計,就獲得了不重複的數字個數,時間複雜度爲O(n)。函數
4. Bit-map應用之快速查詢
一樣,咱們利用Bit-map也能夠進行快速查詢,這種狀況下對於一個數字只須要一個bit位就能夠了,0表示不存在,1表示存在。假設上述的題目改成,如何快速判斷一個數字是夠存在於上述的2.5億個數字集合中。
同以前同樣,首先咱們先對全部的數字進行一次遍歷,而後將相應的轉態位改成1。遍歷完之後就是查詢,因爲咱們的Bit-map採起的是連續存儲(整型數組形式,一個數組元素對應32bits),咱們其實是採用了一種分桶的思想。一個數組元素能夠存儲32個狀態位,那將待查詢的數字除以32,定位到對應的數組元素(桶),而後再求餘(%32),就能夠定位到相應的狀態位。若是爲1,則表明改數字存在;不然,該數字不存在。spa
5. Bit-map擴展——Bloom Filter(布隆過濾器)
當一個元素被加入集合中時,經過k各散列函數將這個元素映射成一個位數組中的k個點,並將這k個點所有置爲1.
有必定的誤判率--在判斷一個元素是否屬於某個集合時,有可能會把不屬於這個集合的元素誤判爲屬於這個集合.所以,它不適合那些"零誤判"的應用場合.在能容忍低誤判的應用場景下,布隆過濾器經過極少的誤判換區了存儲空間的極大節省.
Bloom Filter使用k個相互獨立的哈希函數(Hash Function),它們分別將集合中的每一個元素映射到{1,…,m}的範圍中。對任意一個元素x,第i個哈希函數映射的位置hi(x)就會被置爲1(1≤i≤k)。注:若是一個位置屢次被置爲1,那麼只有第一次會起做用,後面幾回將沒有任何效果。
.net
在判斷y是否屬於這個集合時,對y應用k次哈希函數,若全部hi(y)的位置都是1(1≤i≤k),就認爲y是集合中的元素,不然就認爲y不是集合中的元素。設計
詳見:http://www.javashuo.com/article/p-uvastzse-kr.html
htm
6. 總結
使用Bit-map的思想,咱們能夠將存儲空間進行壓縮,並且能夠對數字進行快速排序、去重和查詢的操做。Bloom Fliter是Bit-map思想的一種擴展,它能夠在容許低錯誤率的場景下,大大地進行空間壓縮,是一種拿錯誤率換取空間的數據結構。
7. 應用
適用範圍:可進行數據的快速查找,判重,刪除,通常來講數據範圍是int的10倍如下
基本原理及要點:使用bit數組來表示某些元素是否存在,好比8位電話號碼
擴展:bloom filter能夠看作是對bit-map的擴展
問題實例:
一、已知某個文件內包含一些電話號碼,每一個號碼爲8位數字,統計不一樣號碼的個數。
8位最多99 999 999,大概須要99m個bit,大概10幾M字節的內存便可。
二、在2.5億個整數中找出不重複的整數,內存不足以容納這2.5億個整數。
方案1:採用2-Bitmap(每一個數分配2bit,00表示不存在,01表示出現一次,10表示屢次,11無心義)進行,共需內存232*2bit
=1GB內存,還能夠接受。而後掃描這2.5億個整數,查看Bitmap中相對應位,若是是00變01,01變10,10保持不變。所描完過後,查看bitmap,把對應位是01的整數輸出便可。
https://www.cnblogs.com/yangjiannr/p/da-shu-ju-chu-libitmap.html