1. 程式人生 > >Bloom Filter:海量資料的HashSet

Bloom Filter:海量資料的HashSet

Bloom Filter一般用於資料的去重計算,近似於HashSet的功能;但是不同於Bitmap(用於精確計算),其為一種估算的資料結構,存在誤判(false positive)的情況。

1. 基本原理

Bloom Filter能高效地表徵資料集合\(S = \lbrace x_1 ,x_2 ,...,x_n \rbrace\),判斷某個資料是否屬於這個集合。其基本思想如下:用長度為\(m\)的位陣列\(A\)來儲存集合資訊,同時是有\(k\)個獨立的hash函式\(h_i(1\le i \le k)\)將資料對映到位陣列空間。具體流程如下:

  1. 將長度為\(m\)的位陣列全置為0;
  2. 對於資料\(x \in S\)
    ,依次計算其\(k\)個hash函式值\(h_i(x)=w,且1\le i \le k, 1 \le w \le m\),將位陣列中的第\(a\)位bit置為1,即A[w]=1.

當查詢資料\(y\)是否屬於集合\(S\)時,計算其\(k\)個hash函式值,如果\(h_i(y)\)對應的位陣列均為1,則資料\(y\)屬於集合\(S\);反之,則不屬於。

2. 相關計算

在上述判斷中,可能存在誤判(false positive, FP),比如某數的\(k\)個hash函式值可能屬於集合\(S\)中某幾個數\(k\)個hash函式值組成的集合。顯然,誤判率跟集合大小\(n\)、位陣列大小\(m\)

、hash函式的個數\(k\)有關;在其他條件不變的情況下,若\(n\)越大(\(m\)越小,或\(k\)越多),則誤判率越高。誤判率估算公式如下:

\[ P_{fp} \approx (1-e^{-kn/m})^k \]

在實際的場景中,常常是已知集合大小\(n\),預設誤判率\(P_{fp}\),需要計算位陣列大小\(m\)、hash函式的個數\(k\)。通過一系列的數學推導,可得到如下公式:

\[ m= - \frac{n\ln P_{fp}}{(\ln 2)^2} \]

\[ k=\frac{m}{n}\ln 2 \]

詳細的數學推導可參看相關文件。

3. 實戰

Bloom Filter的Java實現有Guava、

stream-lib,Scala實現有breezebloom-filter-scala。採用breeze庫的Distinct Count實現如下:

import breeze.util.BloomFilter

val bf = BloomFilter.optimallySized[Int](5, 0.01)
val arr = Array(1, 3, 4, 5, 1, 2, 6, 3, 1)
var cnt = 0
arr.foreach { t =>
  bf.contains(t) match {
    case false => cnt += 1; bf.+=(t)
    case _ =>
  }
}
println(arr.distinct.length) // 6
println(cnt) // 6

從上面的Scala程式碼中,不難發現:在Distinct Count計算過程中,需要定義一個global變數,逐一用於對每個不屬於集合元素進行計算。顯然,在分散式計算中,這種方法不太適用;因為global變數沒法做到實時的傳遞更新。因此,另一種估算演算法HyperLogLog,擁有優秀的可加性、易於並行化,在大資料的場景下應用廣泛——Spark、Kylin中的近似Distinct Count便是基於此。

4. 參考資料

[1] Broder, Andrei, and Michael Mitzenmacher. "Network Applications of Bloom Filters: A Survey." Internet Mathematics 1.4 (2011): 485-509.
[2] 張俊林, 《大資料日知錄》.

相關推薦

Bloom Filter海量資料HashSet

Bloom Filter一般用於資料的去重計算,近似於HashSet的功能;但是不同於Bitmap(用於精確計算),其為一種估算的資料結構,存在誤判(false positive)的情況。 1. 基本原理 Bloom Filter能高效地表徵資料集合\(S = \lbrace x_1 ,x_2 ,...,x_

HyperLogLog海量資料下的基數計算

1. 什麼是基數計算 基數計算(cardinality counting)指的是統計一批資料中的不重複元素的個數,常見於計算獨立使用者數(UV)、維度的獨立取值數等等。實現基數統計最直接的方法,就是採用集合(Set)這種資料結構,當一個元素從未出現過時,便在集合中增加一個元素;如果出現過,那麼集合仍保持不變

Excel數字提取神器海量資料一鍵提取!學會這一招,簡直完勝!

當我們在處理複雜的Excel表格時,經常會碰到一些複雜的資料,如果我們只想要裡面的數字,那麼有沒有辦法只將數字提取出來呢?答案是有的。今天小編就教大家幾個技巧,完全不費吹灰之力! 提取文字左側資料 當單元格中數字在左,文字在右時,我們可以利用這個公式。 函式公式:【=LEFT(A2,2*LEN

大量資料去重Bitmap點陣圖演算法和布隆過濾器(Bloom Filter)

Bitmap演算法 與其說是演算法,不如說是一種緊湊的資料儲存結構。是用記憶體中連續的二進位制位(bit),用於對大量整型資料做去重和查詢。其實如果並非如此大量的資料,有很多排重方案可以使用,典型的就是雜湊表。 實際上,雜湊表為每一個可能出現的數字提供了一個一一對映的關係,每個元素都相當於有

海量資料處理演算法—Bloom Filter

                1. Bloom-Filter演算法簡介        Bloom-Filter,即布隆過濾器,1970年由Bloom中提出。它可以用於檢索一個元素是否在一個集合中。Bloom Filter(BF)是一種空間效率很高的隨機資料結構,它利用位陣列很簡潔地表示一個集合,並能判斷一個

海量資料處理之Bloom Filter詳解

一、什麼是Bloom Filter    Bloom Filter是一種空間效率很高的隨機資料結構,它的原理是,當一個元素被加入集合時,通過K個Hash函式將這個元素對映成一個位陣列(Bit array)中的K個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約

大量資料去重Bitmap和布隆過濾器(Bloom Filter)

5TB的硬碟上放滿了資料,請寫一個演算法將這些資料進行排重。如果這些資料是一些32bit大小的資料該如何解決?如果是64bit的呢?在面試時遇到的問題,問題的解決方案十分典型,但對於海量資料處理接觸少的同學可能一時也想不到什麼好方案。介紹兩個演算法,對於空間的利用到達了一種極

海量數據處理算法—Bloom Filter

內存地址空間 核心 全世界 在服務器 i++ func ras get 地址空間 1. Bloom-Filter算法簡介 Bloom-Filter,即布隆過濾器,1970年由Bloom中提出。它可以用於檢索一個元素是否在一個集合中。 Bloom

由散列表到BitMap的概念與應用(三)面試中的海量資料處理

一道面試題 在面試軟體開發工程師時,經常會遇到海量資料排序和去重的面試題,特別是大資料崗位。 例1:給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,找出a、b檔案共同的url? 首先我們最常想到的方法是讀取檔案a,建立雜湊表,然後再讀取檔案b,遍歷檔

十道海量資料處理面試題與十個方法大總結

轉載之處:http://blog.csdn.net/liuqiyao_01/article/details/26567237 筆試 = (資料結構+演算法) 50%+ (計算機網路 + 作業系統)30% +邏輯智力題10%  + 資料庫5% + 歪門邪道題5%,而面

基於Bloom-Filter演算法和記憶體資料庫的大量資料輕量級100%排重方案

總體模組:一次排重模組(基於布隆演算法) + 二次排重方案(基於記憶體資料庫) 一次排重 //雜湊函式,返回型別為int型 //int型數的總數量[4294967296] (範圍大約在正負21億) //int型別4個位元組,32bits //排重標誌陣列的總長度[4294967296/(4*

海量資料處理十道面試題與十個海量資料處理方法總結(大資料演算法面試題)

第一部分、十道海量資料處理面試題 1、海量日誌資料,提取出某日訪問百度次數最多的那個IP。       首先是這一天,並且是訪問百度的日誌中的IP取出來,逐個寫入到一個大檔案中。注意到IP是32位的,最多有個2^32個IP。同樣可以採用對映的方法

海量資料處理十道面試題與十個海量資料處理方法總結

第一部分、十道海量資料處理面試題 1、海量日誌資料,提取出某日訪問百度次數最多的那個IP。 首先是這一天,並且是訪問百度的日誌中的IP取出來,逐個寫入到一個大檔案中。注意到IP是32位的,最多有個2^32個IP。同樣可以採用對映的方法,比如模1000,把整個大檔

萬字長文揭祕阿里如何實現海量資料實時分析?

阿里妹導讀:隨著資料量的快速增長,越來越多的企業迎來業務資料化時代,資料成為了最重要的生產資料和業務升級依據。本文由阿里AnalyticDB團隊出品,近萬字長文,首次深度解讀阿里在海量資料實時分析領域的多項核心技術。 數字經濟時代已經來臨,希望能和業界同行共同探索,加速行

海量資料處理經典例項分析

有關海量資料處理的問題,主要有以下3類:top K問題、重複問題、排序問題 top K 問題 在大規模資料處理中,經常會遇到的一類問題:在海量資料中找出出現頻率最高的前K個數,或者從海量資料中找出最大的前K個數,這類問題通常被稱為top K問題。例如,在搜尋引擎

個人經驗總結處理海量資料的經驗和技巧

在實際的工作環境下,許多人會遇到海量資料這個複雜而艱鉅的問題,它的主要難點有以下幾個方面: 一、資料量過大,資料中什麼情況都可能存在。 如果說有10條資料,那麼大不了每條去逐一檢查,人為處理,如果有上百條資料,也可以考慮,如果資料上到千萬級別,甚至過億,那不是手工能解決的了

資料經典演算法——bit-map與bloom filter

明白了雜湊的原理,bit-map就好說了。 bit-map的核心思想是:所謂的Bit-map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。每一個bit空間都是儲存單元,而不像

海量資料相似性度量與聚類 LHS-MinHash

海量資料相似性度量與聚類: LHS-MinHash   寫本文的原因是近期在涉獵使用者畫像相關的無監督學習理論,剛好看到一篇運用LHS-MinHash做使用者聚類的文章,卻講得過於籠統,對我這樣的萌新(菜雞)不太友好。於是我去搜索了關於LHS-MinHash和simhash的相關部落格,

資料處理演算法--Bloom Filter

一、布隆過濾器(Bloom Filter)的定義 布隆過濾器可以用來檢測資料是否存在於一個集合中。它是hash的擴充套件,底層就是一個位數組,每一個bit位可以表示一個數字,所以布隆過濾器是基於點陣圖來實現的。 二、布隆過濾器的原理 1、插入資料 在點陣圖中,每一個bi

海量資料探勘MMDS week2: 頻繁項集挖掘 Apriori演算法的改進基於hash的方法

海量資料探勘Mining Massive Datasets(MMDs) -Jure Leskovec courses學習筆記之關聯規則Apriori演算法的改進:基於hash的方法:PCY演算法, Multistage演算法, Multihash演算法 Apriori演