日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

海量數(shù)據(jù)處理的算法 海量數(shù)據(jù)處理

海量數(shù)據(jù)處理(海量數(shù)據(jù)處理的算法)
主要講述一下 Bloom Filter算法
Bloom Filter(BF)是一種空間效率很高的隨機(jī)數(shù)據(jù)結(jié)構(gòu),它利用位數(shù)組很簡(jiǎn)潔地表示一個(gè)集合,并能判斷一個(gè)元素是否屬于這個(gè)集合 。它是一個(gè)判斷元素是否存在集合的快速的概率算法 。Bloom Filter有可能會(huì)出現(xiàn)錯(cuò)誤判斷,但不會(huì)漏掉判斷 。也就是BloomFilter判斷元素不再集合,那肯定不在 。如果判斷元素存在集合中,有一定的概率判斷錯(cuò)誤 。因此,BloomFilter不適合那些“零錯(cuò)誤”的應(yīng)用場(chǎng)合 。
而在能容忍低錯(cuò)誤率的應(yīng)用場(chǎng)合下,BloomFilter比其他常見(jiàn)的算法(如hash,折半查找)極大節(jié)省了空間 。
BloomFilter的詳細(xì)介紹:海量數(shù)據(jù)處理之Bloom Filter詳解
【適用范圍】
可以用來(lái)實(shí)現(xiàn)數(shù)據(jù)字典,進(jìn)行數(shù)據(jù)的判重,或者集合求交集
【基本原理及要點(diǎn)】
原理要點(diǎn):一是位數(shù)組,而是k個(gè)獨(dú)立hash函數(shù) 。
1)位數(shù)組:
假設(shè)BloomFilter使用一個(gè)m比特的數(shù)組來(lái)保存信息,初始狀態(tài)時(shí),Bloom Filter是一個(gè)包含m位的位數(shù)組,每一位都置為0,即BF整個(gè)數(shù)組的元素都設(shè)置為0 。

海量數(shù)據(jù)處理的算法 海量數(shù)據(jù)處理


2)k個(gè)獨(dú)立hash函數(shù)
為了表達(dá)S={x1, x2,…,xn}這樣一個(gè)n個(gè)元素的集合,BloomFilter使用k個(gè)相互獨(dú)立的哈希函數(shù)(Hash Function),它們分別將集合中的每個(gè)元素映射到{1,…,m}的范圍中 。
當(dāng)我們往Bloom Filter中增加任意一個(gè)元素x時(shí)候,我們使用k個(gè)哈希函數(shù)得到k個(gè)哈希值,然后將數(shù)組中對(duì)應(yīng)的比特位設(shè)置為1 。即第i個(gè)哈希函數(shù)映射的位置hashi(x)就會(huì)被置為1(1≤i≤k) 。注意,如果一個(gè)位置多次被置為1,那么只有第一次會(huì)起作用,后面幾次將沒(méi)有任何效果 。在下圖中,k=3,且有兩個(gè)哈希函數(shù)選中同一個(gè)位置(從左邊數(shù)第五位,即第二個(gè)“1“處) 。
海量數(shù)據(jù)處理的算法 海量數(shù)據(jù)處理


3)判斷元素是否存在集合
在判斷y是否屬于這個(gè)集合時(shí),我們只需要對(duì)y使用k個(gè)哈希函數(shù)得到k個(gè)哈希值,如果所有hashi(y)的位置都是1(1≤i≤k),即k個(gè)位置都被設(shè)置為1了,那么我們就認(rèn)為y是集合中的元素,否則就認(rèn)為y不是集合中的元素 。下圖中y1就不是集合中的元素(因?yàn)閥1有一處指向了“0”位) 。y2或者屬于這個(gè)集合,或者剛好是一個(gè)false positive 。
海量數(shù)據(jù)處理的算法 海量數(shù)據(jù)處理


顯然這 個(gè)判斷并不保證查找的結(jié)果是100%正確的 。
BloomFilter的缺點(diǎn):
1)Bloom Filter無(wú)法從Bloom Filter集合中刪除一個(gè)元素 。因?yàn)樵撛貙?duì)應(yīng)的位會(huì)牽動(dòng)到其他的元素 。所以一個(gè)簡(jiǎn)單的改進(jìn)就是 counting Bloom filter,用一個(gè)counter數(shù)組代替位數(shù)組,就可以支持刪除了 。此外,BloomFilter的hash函數(shù)選擇會(huì)影響算法的效果 。
2)還有一個(gè)比較重要的問(wèn)題,如何根據(jù)輸入元素個(gè)數(shù)n,確定位數(shù)組m的大小及hash函數(shù)個(gè)數(shù),即hash函數(shù)選擇會(huì)影響算法的效果 。當(dāng)hash函數(shù)個(gè)數(shù)k=(ln2)*(m/n)時(shí)錯(cuò)誤率最小 。在錯(cuò)誤率不大于E的情況 下,m至少要等于n*lg(1/E) 才能表示任意n個(gè)元素的集合 。但m還應(yīng)該更大些,因?yàn)檫€要保證bit數(shù)組里至少一半為0,則m應(yīng) 該>=nlg(1/E)*lge,大概就是nlg(1/E)1.44倍(lg表示以2為底的對(duì)數(shù)) 。
舉個(gè)例子我們假設(shè)錯(cuò)誤率為0.01,則此時(shí)m應(yīng)大概是n的13倍 。這樣k大概是8個(gè) 。
注意:
這里m與n的單位不同,m是bit為單位,而n則是以元素個(gè)數(shù)為單位(準(zhǔn)確的說(shuō)是不同元素的個(gè)數(shù)) 。通常單個(gè)元素的長(zhǎng)度都是有很多bit的 。所以使用bloom filter內(nèi)存上通常都是節(jié)省的 。

推薦閱讀