1. 程式人生 > >海量資料處理演算法總結【超詳解】

海量資料處理演算法總結【超詳解】

【Bloom Filter】
Bloom Filter(BF)是一種空間效率很高的隨機資料結構,它利用位陣列很簡潔地表示一個集合,並能判斷一個元素是否屬於這個集合。它是一個判斷元素是否存在集合的快速的概率演算法。Bloom Filter有可能會出現錯誤判斷,但不會漏掉判斷。也就是Bloom Filter判斷元素不再集合,那肯定不在。如果判斷元素存在集合中,有一定的概率判斷錯誤。因此,Bloom Filter不適合那些“零錯誤”的應用場合。

而在能容忍低錯誤率的應用場合下,Bloom Filter比其他常見的演算法(如hash,折半查詢)極大節省了空間。 

【適用範圍】 
可以用來實現資料字典,進行資料的判重,或者集合求交集 


【基本原理及要點】

原理要點:一是位陣列, 而是k個獨立hash函式。

1)位陣列:

假設Bloom Filter使用一個m位元的陣列來儲存資訊,初始狀態時,Bloom Filter是一個包含m位的位陣列,每一位都置為0,即BF整個陣列的元素都設定為0。


2)k個獨立hash函式

      為了表達S={x1, x2,…,xn}這樣一個n個元素的集合,Bloom Filter使用k個相互獨立的雜湊函式(Hash Function),它們分別將集合中的每個元素對映到{1,…,m}的範圍中。

          當我們往Bloom Filter中增加任意一個元素x時候,我們使用k個雜湊函式得到k個雜湊值,然後將陣列中對應的位元位設定為1。即第i個雜湊函式對映的位置hashi

(x)就會被置為11ik)。 注意,如果一個位置多次被置為1,那麼只有第一次會起作用,後面幾次將沒有任何效果。在下圖中,k=3,且有兩個雜湊函式選中同一個位置(從左邊數第五位,即第二個“1“處)。  

 3)判斷元素是否存在集合

    在判斷y是否屬於這個集合時,我們只需要對y使用k個雜湊函式得到k個雜湊值,如果所有hashi(y)的位置都是1(1≤i≤k),即k個位置都被設定為1了,那麼我們就認為y是集合中的元素,否則就認為y不是集合中的元素。下圖中y1就不是集合中的元素(因為y1有一處指向了“0”位)。y2或者屬於這個集合,或者剛好是一個false positive。


      顯然這 個判斷並不保證查詢的結果是100%正確的。

Bloom Filter的缺點:

       1)Bloom Filter無法從Bloom Filter集合中刪除一個元素因為該元素對應的位會牽動到其他的元素。所以一個簡單的改進就是 counting Bloom filter,用一個counter陣列代替位陣列,就可以支援刪除了。 此外,Bloom Filter的hash函式選擇會影響演算法的效果。

       2)還有一個比較重要的問題,如何根據輸入元素個數n,確定位陣列m的大小及hash函式個數,hash函式選擇會影響演算法的效果當hash函式個數k=(ln2)*(m/n)時錯誤率最小。在錯誤率不大於E的情況 下,m至少要等於n*lg(1/E) 才能表示任意n個元素的集合。但m還應該更大些,因為還要保證bit數組裡至少一半為0,則m應 該>=nlg(1/E)*lge ,大概就是nlg(1/E)1.44倍(lg表示以2為底的對數)。

舉個例子我們假設錯誤率為0.01,則此時m應大概是n的13倍。這樣k大概是8個。 

 注意:

         這裡m與n的單位不同,m是bit為單位,而n則是以元素個數為單位(準確的說是不同元素的個數)。通常單個元素的長度都是有很多bit的。所以使用bloom filter記憶體上通常都是節省的。 

       一般BF可以與一些key-value的資料庫一起使用,來加快查詢。由於BF所用的空間非常小,所有BF可以常駐記憶體。這樣子的話,對於大部分不存在的元素,我們只需要訪問記憶體中的BF就可以判斷出來了,只有一小部分,我們需要訪問在硬碟上的key-value資料庫。從而大大地提高了效率。

【擴充套件】 
Bloom filter將集合中的元素對映到位陣列中,用k(k為雜湊函式個數)個對映位是否全1表示元素在不在這個集合中。Counting bloom filter(CBF)將位陣列中的每一位擴充套件為一個counter,從而支援了元素的刪除操作。Spectral Bloom Filter(SBF)將其與集合元素的出現次數關聯。SBF採用counter中的最小值來近似表示元素的出現頻率。 


【問題例項】 
給你A,B兩個檔案,各存放50億條URL,每條URL佔用64位元組,記憶體限制是4G,讓你找出A,B檔案共同的URL。如果是三個乃至n個檔案呢? 
根據這個問題我們來計算下記憶體的佔用,4G=2^32大概是40億*8大概是340億bit,n=50億,如果按出錯率0.01算需要的大概是650億個bit。 現在可用的是340億,相差並不多,這樣可能會使出錯率上升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。

2. Hash

【什麼是Hash】 
       Hash,一般翻譯做“雜湊”,也有直接音譯為“雜湊”的,就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。 
       HASH主要用於資訊保安領域中加密演算法,它把一些不同長度的資訊轉化成雜亂的128位的編碼,這些編碼值叫做HASH值. 也可以說,hash就是找到一種資料內容和資料存放地址之間的對映關係。 
      陣列的特點是:定址容易,插入和刪除困難;而連結串列的特點是:定址困難,插入和刪除容易。那麼我們能不能綜合兩者的特性,做出一種定址容易,插入刪除也容易的資料結構?答案是肯定的,這就是我們要提起的雜湊表,雜湊表有多種不同的實現方法,我接下來解釋的是最常用的一種方法——拉鍊法,(也是樹的一種儲存結構,稱為二叉連結串列)我們可以理解為“連結串列的陣列”,如圖: 


                                                  
     左邊很明顯是個陣列,陣列的每個成員包括一個指標,指向一個連結串列的頭,當然這個連結串列可能為空,也可能元素很多。我們根據元素的一些特徵把元素分配到不同的連結串列中去,也是根據這些特徵,找到正確的連結串列,再從連結串列中找出這個元素。 
元素特徵轉變為陣列下標的方法就是雜湊法。

雜湊法當然不止一種,下面列出三種比較常用的:
1,除法雜湊法 (求模數)
最直觀的一種,上圖使用的就是這種雜湊法,公式: 
index = value % 16 
學過彙編的都知道,求模數其實是通過一個除法運算得到的,所以叫“除法雜湊法”。 
2,平方雜湊法 
求index是非常頻繁的操作,而乘法的運算要比除法來得省時(對現在的CPU來說,估計我們感覺不出來),所以我們考慮把除法換成乘法和一個位移操作。公式: 
index = (value * value) >> 28 
如果數值分配比較均勻的話這種方法能得到不錯的結果,但我上面畫的那個圖的各個元素的值算出來的index都是0——非常失敗。也許你還有個問題,value如果很大,value * value不會溢位嗎?答案是會的,但我們這個乘法不關心溢位,因為我們根本不是為了獲取相乘結果,而是為了獲取index。 
3,斐波那契(Fibonacci)雜湊法 
平方雜湊法的缺點是顯而易見的,所以我們能不能找出一個理想的乘數,而不是拿value本身當作乘數呢?答案是肯定的。 
1,對於16位整數而言,這個乘數是40503 
2,對於32位整數而言,這個乘數是2654435769 
3,對於64位整數而言,這個乘數是11400714819323198485 
這幾個“理想乘數”是如何得出來的呢?這跟一個法則有關,叫黃金分割法則,而描述黃金分割法則的最經典表示式無疑就是著名的斐波那契數列,如果你還有興趣,就到網上查詢一下“斐波那契數列”等關鍵字,我數學水平有限,不知道怎麼描述清楚為什麼,另外斐波那契數列的值居然和太陽系八大行星的軌道半徑的比例出奇吻合,很神奇,對麼?
對我們常見的32位整數而言,公式: 
i ndex = (value * 2654435769) >> 28 
如果用這種斐波那契雜湊法的話,那我上面的圖就變成這樣了: 

                                             
很明顯,用斐波那契雜湊法調整之後要比原來的取摸雜湊法好很多。 
【適用範圍】 
快速查詢,刪除的基本資料結構,通常需要總資料量可以放入記憶體。 
【基本原理及要點】 
hash函式選擇,針對字串,整數,排列,具體相應的hash方法。 
碰撞處理:

一種是open hashing,也稱為拉鍊法;

另一種就是closed hashing,也稱開地址法,opened addressing。 
【擴充套件】 
d-left hashing中的d是多個的意思,我們先簡化這個問題,看一看2-left hashing。2-left hashing指的是將一個雜湊表分成長度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個雜湊函式,h1和h2。在儲存一個新的key時,同 時用兩個雜湊函式進行計算,得出兩個地址h1[key]和h2[key]。這時需要檢查T1中的h1[key]位置和T2中的h2[key]位置,哪一個 位置已經儲存的(有碰撞的)key比較多,然後將新key儲存在負載少的位置。如果兩邊一樣多,比如兩個位置都為空或者都儲存了一個key,就把新key 儲存在左邊的T1子表中,2-left也由此而來。在查詢一個key時,必須進行兩次hash,同時查詢兩個位置。 
【問題例項】 
1).海量日誌資料,提取出某日訪問百度次數最多的那個IP。 
IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入記憶體,然後進行統計。

3. Bit-map

【什麼是Bit-map】 
        所謂的Bit-map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。由於採用了Bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。

        如果說了這麼多還沒明白什麼是Bit-map,那麼我們來看一個具體的例子,假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這裡假設這些元素沒有重複)。那麼我們就可以採用Bit-map的方法來達到排序的目的。要表示8個數,我們就只需要8個Bit(1Bytes),首先我們開闢1Byte的空間,將這些空間的所有Bit位都置為0(如下圖:)
                                                       


然後遍歷這5個元素,首先第一個元素是4,那麼就把4對應的位置為1(可以這樣操作 p+(i/8)|(0x01<<(i%8)) 當然了這裡的操作涉及到Big-ending和Little-ending的情況,這裡預設為Big-ending),因為是從零開始的,所以要把第五位置為一(如下圖):
 

                                                      


然後再處理第二個元素7,將第八位置為1,,接著再處理第三個元素,一直到最後處理完所有的元素,將相應的位置為1,這時候的記憶體的Bit位的狀態如下: 
 

                                                  


然後我們現在遍歷一遍Bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。下面的程式碼給出了一個BitMap的用法:排序。 

C程式碼  

複製程式碼
1//定義每個Byte中有8個Bit位    2#includememory.h3#define BYTESIZE 84voidSetBit(char*p,int posi)5{6for(int i=0; i (posi/BYTESIZE); i++)7{8                  p++;9}1011*p =*p|(0x01<<(posi%BYTESIZE));//將該Bit位賦值1    12return;13}1415voidBitMapSortDemo()16{17//為了簡單起見,我們不考慮負數    18int num[]={3,5,2,10,6,12,8,14,9};1920//BufferLen這個值是根據待排序的資料中最大值確定的    21//待排序中的最大值是14,因此只需要2個Bytes(16個Bit)    22//就可以了。    23constintBufferLen=2;24char*pBuffer =newchar[BufferLen];2526//要將所有的Bit位置為0,否則結果不可預知。    27             memset(pBuffer,0,BufferLen);28for(int i=0;i9;i++)
            
           

相關推薦

海量資料處理演算法總結

【Bloom Filter】Bloom Filter(BF)是一種空間效率很高的隨機資料結構,它利用位陣列很簡潔地表示一個集合,並能判斷一個元素是否屬於這個集合。它是一個判斷元素是否存在集合的快速的概率演算法。Bloom Filter有可能會出現錯誤判斷,但不會漏掉判斷。也就是Bloom Filter判斷元素

php 大資料量及海量資料處理演算法總結

下面的方法是我對海量資料的處理方法進行了一個一般性的總結,當然這些方法可能並不能完全覆蓋所有的問題,但是這樣的一些方法也基本可以處理絕大多數遇到的問題。下面的一些問題基本直接來源於公司的面試筆試題目,方法不一定最優,如果你有更好的處理方法,歡迎與我討論。 1.Bloom f

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

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

海量資料處理演算法—Bit-Map

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

影象資料處理演算法總結

本博文主要介紹了影象處理的一些基礎知識 一. 影象儲存原理 影象儲存原理主要分為5種 1. RGB顏色空間,使用最為廣泛的顏色空間。 2. CMY(K)顏色空間,主要用於印刷行業。 3. HSV/HSL(I)顏色空間,人類視覺,和畫家配色領域。 4. CIE-XYZ顏色空間,

線性規劃網路流 :工廠最大效益——單純形演算法+題解

問題:某食品加工廠一共有三個車間,第一車間用 1 個單位的原料 N 可以加工 5 個單位的產品 A 或 2 個單位的產品 B。產品 A 如果直接售出,售價為 10 元,如果在第二車間繼續加工,則需要額外加工費 5 元,加工後售價為 19 元。產品 B 如果直接售出,售價 16

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

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

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

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

大資料量,海量資料處理方法總結

大資料量的問題是很多面試筆試中經常出現的問題,比如baidu google 騰訊這樣的一些涉及到海量資料的公司經常會問到。 下面的方法是我對海量資料的處理方法進行了一個一般性的總結,當然這些方法可能並不能完全覆蓋所有的問題,但是這樣的一些方法也基本

集合Java集合總結(下)-常用集合類對比

今天我們主要看一張圖。 圖是無意中在網上發現的,個人覺得非常好。(時間久了就忘了出處,請原創原諒~~) 我們還是從左到右分析。 ①所有的類都用到Iterator則說明所有的集合類都有遍歷集合的方法。 ②LinkedList除了繼承AbstractSe

Ray Tracing in One Weekend 光線追蹤1-5

  一天一篇,今天來學習第7章 (散射)漫反射材質 Chapter7: Diffuse Materials  Preface 從這一章開始,我們將通過光線追蹤製作一些逼真的材質。 我們將從漫射(磨砂)材料開始。   先看效果:     正文

內部排序演算法比較(

一、題目描述 通過隨機資料比較各排序演算法的關鍵字比較次數和關鍵字移動次數,以 及執行時間,取得直觀感受。 二、設計要求 一、需求分析 實現各排序演算法,分別進行以下各組比較,並進行總結。 一、各演算法在不同規模下的比較。 1)比較範圍:直接插

Ray Tracing in One Weekend 光線追蹤1-6

  新的一年,前來打卡  Preface 回顧上一篇,我們講述了漫反射材質,也就是平時的磨砂表面。 它一種將入射光經表面隨機散射形成的材質,是一種非常普遍的表面形式。 這一篇,我們將來學習鏡面反射,或者說是金屬材質 鏡面在生活中見得也很多,它是一種將入射光經表面按照物理反射規律

Ray Tracing in One Weekend 光線追蹤1-7 Dielectric 半徑為負,實心球體鏤空技巧

  今天講這本書最後一種材質  Preface 水,玻璃和鑽石等透明材料是電介質。當光線照射它們時,它會分裂成反射光線和折射(透射)光線。 處理方案:在反射或折射之間隨機選擇並且每次互動僅產生一條散射光線 (實施方法:隨機取樣,具體見後文) 除錯最困難的部分是折射光線。如果有折

Ray Tracing in One Weekend 光線追蹤1-8 自定義相機設計

  今天,我們來學習如何設計自定義位置的相機  ready 我們只需要瞭解我們之前的座標體系,或者說是相機位置    先看效果       Chapter10:Positionable camera 這一章我

Ray Tracing in One Weekend 光線追蹤1-9 景深

    今天我們來學最後一章    Chapter11:Defocus Blur    Preface 散焦模糊 也稱 景深   首先,我們來了解一下散焦模糊,我們在真實相機中散焦模糊的原因是因為它們需要一個大圈(而不僅僅

Ray Tracing in One Weekend 光線追蹤1-10

  《Ray Tracing in One Weekend》完結篇 最近課程上機實驗,封面圖渲染時間也超長,所以寫東西就落下了,見諒 這篇之後,我會繼續《Ray Tracing The Next Week》,還請多多關注   這幾天我在渲染這本書的封面圖,封面圖還沒出,不算結束,

集合Java集合總結(中)-Map家族

接上文,本篇部落格我們接著談論有關集合的內容。 java所有的集合分成三大類。Set類似罐子,把一個物件新增到Set集合時,Set集合無法記住新增這個元素的順序,所以Set裡的元素不能重複。List集合非常想一個數組,可以記住每次新增元素的順序,且List的長

圖文HDFS基本原理

合並操作 ear 系統性能 重要 logs 允許 積累 帶寬 文件系統 本文主要詳述了HDFS的組成結構,客戶端上傳下載的過程,以及HDFS的高可用和聯邦HDFS等內容。若有不當之處還請留言指出。 當數據集大小超過一臺獨立的物理計算機的存儲能力時,就有必要對它進行分區,並存

PPT曹歡歡:今日頭條算法原理

智能 mmu sde dib gap 讀書 class 頭條 相關性 【PPT詳解】曹歡歡:今日頭條算法原理 悟空智能科技 4月8日 公眾號後臺回復:“區塊鏈”,獲取區塊鏈報告 公眾號後臺回復:“sq”,進入區塊鏈分享社群 熱文推薦: 1000位專家推薦,20本區塊鏈