小灰學習大數據——大數據算法探索(1)

  小灰學習大數據主要是針對大數據的面試題和筆試題分析,學習來寫的。但願能讓本身有提示,也能幫助別人。廢話很少說,上題了。html

  • 問:給定a、b兩個文件,各存放50億個url,每一個url各佔64字節,內存限制是4G,讓你找出a、b文件共同的url?

​​​​​​​  首先看到題目開始分析,50億個url,一個64字節是多大呢?node

咱們先來計算,64/1024=0.0625bit一個url.     0.0625*50億約等於320G.這麼看挺大的因此不可能將其徹底加載到內存中處理,考慮採起分而治之的方法。好有這個思路,咱們提出如下方案。面試

方案1:將大文件分紅可以被內存加載的小文件。算法

前面分析每一個文件的大小爲50G×64=320G,遠遠大於內存限制的4G。因此數組

s 遍歷文件a,對每一個url求取 ,而後根據所取得的值將url分別存儲到1000個小文件(記爲 )中。這樣每一個小文件的大約爲300M。數據結構

s 遍歷文件b,採起和a相同的方式將url分別存儲到1000各小文件。這樣處理後,全部可能相同的url都在對應的小文件中,不對應的小文件不可能有相同的url。而後咱們只要求出1000對小文件中相同的url便可。函數

s 求每對小文件中相同的url時,能夠把其中一個小文件的url存儲到hash_set中。而後遍歷另外一個小文件的每一個url,看其是否在剛纔構建的hash_set中,若是是,那麼就是共同的url,存到文件裏面就能夠了。性能

方案2:內存映射成BIT最小存儲單元。(網上看的,因此我準備弄懂它)學習

若是容許有必定的錯誤率,可使用Bloom filter,4G內存大概能夠表示340億bit。將其中一個文件中的url使用Bloom filter映射爲這340億bit,而後挨個讀取另一個文件的url,檢查是否與Bloom filter,若是是,那麼該url應該是共同的url(注意會有必定的錯誤率)。大數據

  首先,咱們來看看什麼事Bloom filter?

Bloom Filter是由Bloom在1970年提出的一種多哈希函數映射的快速查找算法。一般應用在一些須要快速判斷某個元素是否屬於集合,可是並不嚴格要求100%正確的場合。

上過數據結構咱們知道,單一哈希函數發生衝突的機率過高。Hash表衝突的各類解決方法,若要下降衝突發生的機率到1%,就要將BitSet的長度設置爲URL個數的100倍。因此咱們用Bit-Map方法,創建一個BitSet,將每一個URL通過多個哈希函數映射到某一位。下面來看看具體作法

  1. 建立一個m位BitSet,先將全部位初始化爲0,而後選擇k個不一樣的哈希函數。第i個哈希函數對字符串str哈希的結果記爲h(i,str),且h(i,str)的範圍是0到m-1

                       圖1.Bloom Filter加入字符串過

 

    

  •    2.檢查該bitset字符串是否存在

  對於字符串str,分別計算h(1,str),h(2,str)…… h(k,str)。而後檢查BitSet的第h(1,str)、h(2,str)…… h(k,str)位是否爲1,若其中任何一位不爲1則能夠斷定str必定沒有被記錄過。若所有位都是1,則「認爲」字符串str存在; 若一個字符串對應的Bit不全爲1,則能夠確定該字符串必定沒有被Bloom Filter記錄過。(這是顯然的,由於字符串被記錄過,其對應的二進制位確定所有被設爲1了)

  可是若一個字符串對應的Bit全爲1,其實是不能100%的確定該字符串被Bloom Filter記錄過的。(由於有可能該字符串的全部位都恰好是被其餘字符串所對應)這種將該字符串劃分錯的狀況,稱爲false positive 。

  • 3.哈希表和表長參數選擇

    (1)哈希函數選擇

         哈希函數的選擇對性能的影響應該是很大的,一個好的哈希函數要能近似等機率的將字符串映射到各個Bit。選擇k個不一樣的哈希函數比較麻煩,一種簡單的方法是選擇一個哈希函數,而後送入k個不一樣的參數。

       (2)Bit數組大小選擇 

         哈希函數個數k、位數組大小m、加入的字符串數量n的關係能夠參考文獻1。該文獻證實了對於給定的m、n,當 k = ln(2)* m/n 時出錯的機率是最小的。

參考文獻1:http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

相關文章
相關標籤/搜索