大資料問題

2021-07-24 12:30:12 字數 2129 閱讀 7668



在學習c語言階段,大家肯定都寫過這樣的乙個程式:求乙個數的階乘。細心的同學,可能在編碼的時候,會注意這個數的情況~如果給定資料過大,階乘的結果可能會溢位~關於比較大的數的階乘,我們就會採取別的辦法~關於具體的**,之後的文章將會為大家分享~ 

再如,學習堆的時候,我們遇到這樣的問題:n個資料中求取最大的前k個數,如果n不是很大,我們可以採取快排,然後選取的辦法來解決~如果n很大,可以選擇分組或者建堆的方式來解決~這種問題之前都已經解決~ 

然而,我們還會遇到這麼一類問題:找出兩個大檔案的交集等等這樣的問題~下邊,我將會對雜湊這塊遇到的大資料問題做以分析~ 

1.給兩個檔案,分別有100億個整數,我們只有1g記憶體,如何找到兩個檔案交集。

分析:整形數,不管是有符號數還是無符號數,總共有2^32個數字,也就是4g,(100億個數中肯定有重複的),我們可以採用點陣圖來解決,4g個數總共占用512mb記憶體(下邊給出計算過程),1g記憶體是完全夠用的。我們可以將第乙個檔案裡的資料對映到位圖中,再拿第二個檔案的數字去到第乙個檔案對映的點陣圖中去對比,有相同就是交集~(重複的數字,交集中只會出現一次)

2.假定乙個檔案有100億個整形數,1g記憶體,如何找到出現次數不超過兩次的數字。

分析:要想找到出現次數不超過兩次的數字,每個數字設定乙個位是不夠的(乙個位只能表示是否存在),所以我們可以考慮兩個位: 

根據題目的要求,我們可以借助兩個位,來表示數字的存在狀態及存在次數:00表示不存在,01表示存在1次,10表示存在2次,11表示存在超過兩次。根據上邊一道題目的分析:如果乙個數字佔一位,需要512m記憶體就可以;如果乙個數占兩位(乙個整形的32位只能表示16個數了),1g記憶體就可以了。將所有的數字對映到位圖中,查詢不是11的所對應的數字就好了~ 

題目改變假如只給定512m記憶體,如何完成上述問題。 

思路:將所有的資料分批處理,由於是有符號數,我們可以先處理正數,再處理負數,這樣,512m記憶體可以解決上述問題的。

3.給定兩個檔案,分別包含100億個字串,如何快速的找出兩個檔案的交集~

分析:一看到字串,我們立刻想到布隆過濾器來處理這個問題,布隆過濾器可以粗略的表示乙個字串是否在海量字串中(注意是粗略,因為布隆過濾器是有一定的誤判率)。如果想要準確的找到兩個字串檔案的交集,我們可以將大檔案進行分割,將乙個乙個的小檔案分別拿到記憶體中去比對,找到交集。 

布隆過濾器的詳細解決辦法:根據不同的字串雜湊演算法,將字串可以計算出不同的幾個key值,然後進行對映,這樣可以對映到不同的幾個位置,只有當這幾個位同時為1時,這個串才是有可能出現,只要有乙個位是0,那麼這個串一定是不存在的。將第乙個檔案進行對映到布隆過濾器中,拿第二個檔案的每個串,去進行比對(計算出串的key,找到對映的位,看是否全部是1,如果是1,大致認為這個串是兩個串的交集,如果有0,則這個串一定不是交集)這個辦法就是一種近似的演算法~ 

檔案分割的詳細解決辦法:我們可以將100g的字串(假如每個字串佔10位元組,所有的字串全部匯入記憶體會佔:2.5 * 40g * 10 == 25g記憶體(40g的資料,乙個一位元組,大約佔1g記憶體)),所以我們將兩個檔案分別分割成大小相同的100個檔案,然後用第二個檔案的每乙個小檔案進行與檔案1中的每個小檔案進行比對,這樣檔案2中的每個字串都要與檔案1中的每乙個字串進行比較,這樣的話,效率就是比較低的。那麼我們能不能將相似或者相同的字串分在乙個檔案中才減少比較次數~ 

回想:在前邊的一篇文章《找到一組數字的「單身」》這篇文章中,有問題:假如其他數字都出現兩次,如何找到只出現一次的兩個數字,我們就是將所有的數字進行分組,分組依據:根據某個位元位是0還是1,是0分到一組,是1分到另一組,這樣相同的數字就會出現在乙個組內,查詢方便。(註明:分組依據寫的比較簡單,不是特別清楚這個問題的讀者,點文末的鏈結自行學習~)那麼根據上邊題目的思路,我們可以根據字串的某個雜湊演算法,將得到的字串的key值,將key值進行模要分割的檔案數(此處給1000,並對每個檔案分割的小檔案進行編號,0~999),結果相同的就放置在乙個檔案中,這樣相同的字串就會放置在同乙個檔案中(兩個檔案中相同的字串通過同乙個字串雜湊函式,會被分到檔案下標一樣的檔案中),這樣,我們只需要將下標相同的兩個檔案進行比對就好了~~ 

這樣時間複雜度就會明顯降低,時間複雜度是o(n)。

大資料問題

一般解決大資料問題有兩個思路 1 先將與這道題相關的所有的資料結構進行使用一遍,如果有合適的就直接進行使用 2 如果不能直接使用,一般就要進行雜湊切分,然後再使用合適的資料結構進行問題的解決 雜湊切分 1 先估算出要切分的大小 2 然後使用雜湊的除留餘數法進行各個資料的映 問題 1 給乙個超過100...

apple 大資料問題

我同學在joj上出的乙個題 其中涉及到資料較大的問題正常方法用long long 是存不下的 因此要用陣列模擬這個比較大得數,但是 其中有乙個小技巧 就是資料問題 要是隊資料做一下預處理的話用正常資料是可以實現的 同時因為資料量不是很大的原因 這裡如果用完全搜尋的方法 也是不會超過時間限定的 我這裡...

大資料排序問題

程式描述 1 海量資料,記憶體不足,需要將檔案分割成多個檔案,從磁碟讀入 2 將每個小檔案排好序 3 歸併每個排好序的檔案,合成乙個檔案。include include qsort include include include using namespace std int sort num 10...