從另乙個角度看大資料量處理利器 布隆過濾器

2021-09-01 06:46:43 字數 1967 閱讀 9283

思路:從簡單的排序談到bitmap演算法,再談到資料去重問題,談到大資料量處理利器:布隆過濾器。

情景1:對無重複的資料進行排序

@給定資料(2,4,1,12,9,7,6)如何對它排序?

方法1:基本的排序方法包括冒泡,快排等。

方法2:使用bitmap演算法

方法1就不介紹了,方法2中所謂的bitmap是乙個位陣列,跟平時使用的陣列的唯一差別在於操作的是位。

首先是開闢2個位元組大小的位陣列,長度為16(該長度由上述資料中最大的數字12決定的)如圖

然後,讀取資料,2存放在位陣列中下標為1的地方,值從0改為1,4存放在下標為3的地方,值從0改為1....結果如圖

最後,讀取該位陣列,得到排好序的資料是:(1,2,4,6,7,9,12)

比較方法1和方法2的差別:方法2中,排序需要的時間複雜度和空間複雜度很依賴與資料中最大的數字比如12,因此空間上講需要開2個位元組大小的記憶體,時間上需要遍歷完整個陣列。當資料類似(1,1000,10萬)只有3個資料的時候,顯然用方法2,時間複雜度和空間複雜度相當大,但是當資料比較密集時該方法就會顯示出來優勢。

情景2:對有重複的資料進行判重

資料(2,4,1,12,2,9,7,6,1,4)如何找出重複出現的數字?

首先是開闢2個位元組大小的位陣列,長度為16(該長度由上述資料中最大的數字12決定的)如圖

當讀取完12後,陣列中的資料如下圖:

當讀取2的時候,發現陣列中的值是1,則判斷出2是重複出現的。 應用

應用1:某檔案中包含一些8位的**號碼,統計出現的號碼的個數?(判斷有誰出現)

8為最大是99 999 999,大約是99m的bit,12.5mb的記憶體,就可以統計出來出現的號碼。

應用2:

某檔案中包含一些8位的**號碼,統計只出現一次的號碼?

(判斷有誰出現並且指出現1次)

需要擴充套件一下,可以用兩個bit表示乙個號碼,0代表沒有出現過,1代表只出現過1次,2代表至少出現2次。 

應用3:

有兩個檔案,檔案1中有1億個10位的qq號碼,檔案2中有5千萬個10位qq號碼,判斷兩個檔案中重複出現的qq號。

首先建立10的10次方個大小的位陣列(占用記憶體大約是1.25g),全部初始化為0,讀取第乙個檔案,對應的qq號存放到對應的未知,數值改為1,如果重複出現仍是1.讀取完畢第乙個檔案後,讀取第二個檔案,對應的位置為1則表示重複出現。

應用4:

有兩個檔案,檔案1中有1億個15位的qq號碼,檔案2中有5千萬個15位的qq號碼,判斷兩個檔案中重複出現的qq號。

應用4中,qq號碼上公升為15位的時候,顯然記憶體是不夠用了,這個時候怎麼辦?使用

bloom filter(布隆過濾器)

bloom filter(布隆過濾器):

對於bit-map分析一下,每次都會開闢一塊表示最大數值大小的bit陣列,比如情景1中的16,將對應的資料經過對映到bit陣列的下標,這其實是一種最簡單的hash演算法,對1去模。在上述應用4中,當qq號碼改為15位的時候,bit-map就不太好用了,如何改進呢?解決辦法:減少bit陣列的長度,但是增加hash函式的個數

對於每乙個qq號碼,我用k個hash函式,經過k次對映,得到k個不同位置,假設k=3,那麼對於乙個qq號碼,對映到位陣列中3個不同的位置

當讀取第二個包含5千萬個qq號碼的檔案的時候,使用同樣的3個hash函式進行對映,當3個位置全部是1的時候才表示出現過,否則表示沒有出現過。

有什麼疑問嗎?

顯然,對於乙個qq號碼,如果它在第乙個檔案中沒有出現過,但是它對映的3個位置已經全部是1的情況會有嗎?答案是會的,但是這種概率是可控的,可控的意思是:這種誤差跟hash函式的個數和質量是有關係的,可以通過控制hash函式的個數和位陣列的大小來控制誤差概率

。至於表示3者之間的關係

精確的數學公式就不再詳細研究了。

可以這樣講,布隆過濾器是bit-map的進一步擴充套件,對於大資料量判重,布隆過濾器可以在記憶體中進行判斷,避免了對磁碟的讀寫,效率是很高的。以上是自己關於兩者的理解,有錯誤望指教。

從還有乙個角度看大資料量處理利器 布隆過濾器

思路 從簡單的排序談到bitmap演算法。再談到資料去重問題,談到大資料量處理利器 布隆過濾器。情景1 對無反覆的資料進行排序 給定資料 2,4。1,12。9,7,6 怎樣對它排序?方法1 主要的排序方法包含冒泡,快排等。方法2 使用bitmap演算法 方法1就不介紹了。方法2中所謂的bitmap是...

從另乙個角度看自己

從去年11月15號寫下豪言壯語 每天更新一篇,到現在一篇也沒有更新,確實是吹牛吹大了。當然,我並不是忘記了天天積累的重要性,而是,稍微換了乙個地方踐行了不一樣的東西。我從2016年開始,一直在嘗試著通過踐行來重新認知自己,漸漸我發現,很多道理是相通的,很多踐行也是相通的,沒有呈現出來,不代表什麼都沒...

從另乙個角度去解決客戶的需求

重量級客戶的需求終於滿足了,但是又出了新情況。將軍 一休啊,這屏風上畫的老虎每晚都會走出屏風作怪,你來想辦法捉住它吧。注意,客戶是將軍。客戶之前要求顯示虎威,真正的老虎的虎威。於是,好不容易實現了。沒想到他和葉公是鄰居。但是,畫虎容易捉住虎難啊。我該如何解決客戶這個問題,按照將軍的思路去將老虎捉住嗎...