對兩個數組作交集

數組A算法

數組B數組

方法1:對A中的數組進行排序,採起一樣的排序方法對B中的數組進行排序大數據

     1)從A,B中各自取出a,b進行比較url

     2)若是a>b,那麼從B中取出下一個數據b進行比較spa

   3)若是a<b,那麼從A中取出下一個數據a進行比較日誌

     4)若是a=b,那麼找到一個,繼續排序

 

方法2:hash內存

  1)對A中的m個數據裝入到hash表字符串

      2)對B中的n個數據一次去hash表中查詢,若是找到那麼就是相同元素hash

 

方法3: 思路是先把兩個數組去重,合併,再排序一下,重複的元素天然就出來了。

 

升級:若是數據特別大,內存沒法裝下。  兩個大文件,查找相同字符串

  hash,分治法:

     1)採用hash算法對A文件進行hash成a個小文件

     2)採起一樣的hash算法對B文件進行hash成b個小文件

     3)比較小文件對<a1,b1>.........由於hash的問題,因此相同的字符串確定在同個文件對裏面。

     4)統計小文件對,能夠繼續採用hash,對a1的每一字符串創建hash表,遍歷b1的字符串看是否在以前構建的hash表裏面(和上面同樣)

   

   通常來講,若是內存能夠存放,能夠構造hash表,進行查找。若是內存沒法加載,那麼能夠經過hash把大文件分紅多個小文件,從而進行比較。

 

   hash算法在海量數據中的運用:

        單機處理大數據的問題也和mapreduce同樣,分而治之,把海量數據切分紅若干個小份進行處理。

    1)分而治之

         採用hash進行取模進行等價映射,將巨大的文件進行等價分割(符合必定規律的數據會被劃分到同一個文件),劃分紅若干個小文件再進行處理。

    2)利用hashmap進行內存統計

    利用hashMap對小文件裏面的數據進行統計

    3)排序

 

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

能夠估計每一個文件的大小爲5G*64=300G,遠大於4G。因此不可能將其徹底加載到內存中處理。考慮採起分而治之的方法。 
遍歷文件a,對每一個url求取hash(url)%1000,而後根據所得值將url分別存儲到1000個小文件(設爲a0,a1,...a999)當中。這樣每一個小文件的大小約爲300M。遍歷文件b,採起和a相同的方法將url分別存儲到1000個小文件(b0,b1....b999)中。這樣處理後,全部可能相同的url都在對應的小文件(a0 vs b0, a1 vs b1....a999 vs b999)當中,不對應的小文件(好比a0 vs b99)不可能有相同的url。而後咱們只要求出1000對小文件中相同的url便可。 
好比對於a0 vs b0,咱們能夠遍歷a0,將其中的url存儲到hash_map當中。而後遍歷b0,若是url在hash_map中,則說明此url在a和b中同時存在,保存到文件中便可。 
若是分紅的小文件不均勻,致使有些小文件太大(好比大於2G),能夠考慮將這些太大的小文件再按相似的方法分紅小小文件便可。

 

海量日誌數據,提取出某日訪問百度次數最多的那個IP?

IP地址最多有2^32=4G種取值可能,因此不能徹底加載到內存中。  能夠考慮分而治之的策略,按照IP地址的hash(IP)%1024值,將海量日誌存儲到1024個小文件中。每一個小文件最多包含4M個IP地址。  對於每一個小文件,能夠構建一個IP做爲key,出現次數做爲value的hash_map,並記錄當前出現次數最多的1個IP地址。  有了1024個小文件中的出現次數最多的IP,咱們就能夠輕鬆獲得整體上出現次數最多的IP。 

相關文章
相關標籤/搜索