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

2021-09-22 11:18:27 字數 1962 閱讀 4510

思路:從簡單的排序談到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年開始,一直在嘗試著通過踐行來重新認知自己,漸漸我發現,很多道理是相通的,很多踐行也是相通的,沒有呈現出來,不代表什麼都沒...

從工程專案角度看乙個移動機械人結構

1 頭部 2 底盤 肢體結構 3 android系統板 4 電機控制系統 5 slam演算法系統 6 硬體設計 電源供電系統 7 語音系統 ai智慧型語音 8 後台系統 支付 資料庫 9 物料採購 10 銷售 定價 1 結構設計並3d列印 2 雙輪驅動底盤 平衡設計 舵機選擇 3 android主控...