大資料幾乎是新興行業當中繞不開的話題了,當真正接觸或從事大資料以後,應該以什麼思路去把這個不容易啃的硬骨頭解決掉呢?跟隨大聖眾包威客平台的腳步一**竟吧!
一、解決大資料問題的主要思路
不同的人,對大資料也有著不同的理解,從實際意義上看,大資料可以指種類多、流量大、容量大、價值高、處理和分析速度快的真實資料匯聚的產物。通常應用於儲存空間、提高效率等問題上。而解決大資料問題的一般主要思想有如下:
1.檔案切分(將大檔案切成若干個小檔案進行處理);
2.雜湊切分;
3.使用位圖。
二、結合例項,處理大資料問題
【分析】:
這兩個題是同型別的題。ip的數目還是有限的,最多有個2^32(42億)個ip,而且應注意到ip是32位的。
1byte=8位
1kb=1024bytes(位元組)
1mb=1024kb
1gb=1024mb
假設每個ip只出現一次,所需記憶體大概為(32*2^32)位,約為16個g左右。如果記憶體足夠大,就直接進行統計;但是如果記憶體沒有那麼大,可以將大檔案切分成若干個小檔案(假設為100個小檔案),再採用對映的方法。比如用ip位址模1000,這樣,同乙個ip位址肯定會出現在同乙個小檔案中,再找出每個小文中出現頻率最大的ip(可以採用hash_map進行頻率統計,然後再找出頻率最大的幾個)及相應的頻率,然後再在這1000個最大的ip中,找出那個頻率最大的ip,即為所求。
2.給定100億個整數,設計演算法找到只出現一次的整數。
【分析】:
如果是有符號整數的話,範圍為-2147483648~2147483647,無符號整數的話,範圍為0~4294967296。有符號的,使用兩個bitset,乙個存放正數,乙個存放負數。每個數使用兩個位來判斷其出現幾次。00表示出現0次,01出現1次,10出現大於一次。
比如說存放整數100,就將bitset的第100*2位設定為+1,當所有數放完之後,對每兩位進行測試,看其值為多少。若是第i與i+1的值為01,則這個整數:i*2,在集合中只出現了1次,需要總共用bitnum=(2^31*2)個位表示,需空間為int[bitnum],即512m。
3.當前有40億個不重複的、沒排過序的unsignedint的整數,也有乙個任意數,如何快速判斷這個任意數是否在那40億個數當中。
【分析1】:
40億個整數差不多相當於全部整數,需要總共用(2^32)個位表示,需空間為int[bitnum],即512m。申請512m的記憶體,乙個bit位代表乙個unsignedint值。再讀入40億個數,設定相應的bit位,讀入要查詢的數,檢視相應bit位是否為1。為1表示存在,為0表示不存在。
【分析2】:
因為2^32為40億多,所以這個任意數可能在,也可能不在其中。
可以先把40億個數中的每乙個用32位的二進位制來表示,假設這40億個數是放在乙個檔案中的,再將這40億個數分成兩類:分別是最高位為0和最高位為1,並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數≤20億,而另乙個≥20億(這相當於折了),再與要查詢的數的最高位比較並進入相應的檔案再查詢。然後把這個檔案為又分成兩類:分別是次最高位為0和次最高位為1,並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數≤10億,而另乙個≥10億(這相當於折半了),再與要查詢的數的次最高位比較並接著進入相應的檔案再查詢……如此類推,便能找到結果,而且時間複雜度僅為o(logn)。
【分析3】:
此例還可以使用位圖方法。位圖法是常見程式設計任務之一,它能夠判斷整形陣列是否存在重複判斷集合中存在重複。當集合中資料量比較大時,通常希望少進行幾次掃瞄,這時雙重迴圈法就不可取了。但是,位圖法就比較適合這種情況。
它的做法是,按照集合中最大元素max建立乙個長度為max+1的新陣列,然後再次掃瞄原陣列,遇到幾就給新陣列的第幾位置上1,如遇到5就給新陣列的第六個元素置1,這樣下次再遇到5想置位時發現新陣列的第六個元素已經是1了,這說明這次的資料肯定和以前的資料存在著重複。它的運算次數最壞的情況為2n。如果已知陣列的最大值,即能事先給新陣列定長的話效率還能提高一倍。
經典的大資料例題
1 說明 一般解決大資料問題有兩個思路 1 先將與這道題相關的所有的資料結構進行使用一遍,如果有合適的就直接進行使用 2 如果不能直接使用,一般就要進行雜湊切分,然後再使用合適的資料結構進行問題的解決 2 在這裡我先來介紹一種常用於大資料問題的方法 雜湊切分 1 先估算出要切分的大小 2 然後使用雜...
大資料的架構例項(一)
在大資料的發展下,很多的企業也開始重視大資料的應用。而在生活中,大資料也開始變得十分流行了,這些都得益於大資料的架構生態圈打通。我們在這篇文章中重點給大家介紹一下大資料的架構例項,希望能夠幫助大家更好地理解大資料架構。說到大資料的結構我們需要先介紹一下大資料,大資料指無法在一定時間範圍內用常規軟體工...
大資料的架構例項(二)
首先我們說一下研究方面的,比如醫療結構想為偏遠地區的中風畫著提供診斷處方,如果有一種檢測和診斷引擎的話那麼就能夠幫助農村醫生 和應對中風。所以,為了完善這個工具,有的公司就通過多次執行許多演算法來改進診斷,並確保分析足夠廣泛的資料頻譜。這些資料成為了基礎結構。由此可見,大資料的結構在醫療方面做出了很...