海量數(shù)據(jù)處理筆試面試題1_第1頁
海量數(shù)據(jù)處理筆試面試題1_第2頁
海量數(shù)據(jù)處理筆試面試題1_第3頁
海量數(shù)據(jù)處理筆試面試題1_第4頁
海量數(shù)據(jù)處理筆試面試題1_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、海量數(shù)據(jù)處理相關(guān)面試題2010-10-05 18:431. 給定a、b兩個(gè)文件,各存放50億個(gè)url,每個(gè)url各占64字節(jié),內(nèi)存限制是4G,讓你找出a、b文件共同的url?方案1:可以估計(jì)每個(gè)文件安的大小為50G64=320G,遠(yuǎn)遠(yuǎn)大于內(nèi)存限制的4G。所以不可能將其完全加載到內(nèi)存中處理??紤]采取分而治之的方 法。s 遍歷文件a,對(duì)每個(gè)url求取,然后根據(jù)所取得的值將 url分別存儲(chǔ)到1000個(gè)小文件(記為)中。這樣每個(gè)小文件的大約 為300M。s 遍歷文件b,采取和a相同的方式將url分別存儲(chǔ)到1000各小文件(記為)。這樣處理后,所有可能相 同的url都在對(duì)應(yīng)的小文件()中,不對(duì)應(yīng)的小文件

2、不可 能有相同的url。然后我們只要求出1000對(duì)小文件中相同的url即可。s 求每對(duì)小文件中相同的url時(shí),可以把其中一個(gè)小文件的url存儲(chǔ)到hash_set中。然后遍歷另一個(gè)小文件的每個(gè)url,看其是否在剛才構(gòu)建的 hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。方案2:如果允許有一定的錯(cuò)誤率,可以使用Bloom filter,4G內(nèi)存大概可以表示340億bit。將其中一個(gè)文件中的url使用Bloom filter映射為這340億bit,然后挨個(gè)讀取另外一個(gè)文件的url,檢查是否與Bloom filter,如果是,那么該url應(yīng)該是共同的url(注意會(huì)有一定的錯(cuò)誤率

3、)。2. 有10個(gè)文件,每個(gè)文件1G,每個(gè)文件的每一行存放的都是用戶的query,每個(gè)文件的query都可能重復(fù)。要求你按照query的頻度排序。方案1:s 順序讀取10個(gè)文件,按照hash(query)%10的結(jié)果將query寫入到另外10個(gè)文件(記為)中。這樣新生成的文件每個(gè) 的大小大約也1G(假設(shè)hash函數(shù)是隨機(jī)的)。s 找一臺(tái)內(nèi)存在2G左右的機(jī)器,依次對(duì)用hash_map(query, query_count)來統(tǒng)計(jì)每個(gè)query出現(xiàn)的次數(shù)。利用快速/堆/歸并排序按照出現(xiàn)次數(shù)進(jìn)行排序。將排序好的query和對(duì)應(yīng)的 query_cout輸出到文件中。這樣得到了10個(gè)排好序的文件(記為)

4、。s 對(duì)這10個(gè)文件進(jìn)行歸并 排序(內(nèi)排序與外排序相結(jié)合)。方案2:一般query的總量是有限的,只是重復(fù)的次數(shù)比較多而已,可能對(duì)于所有的query,一次性就可以加入到內(nèi)存了。這樣,我們就可以采用trie樹 /hash_map等直接來統(tǒng)計(jì)每個(gè)query出現(xiàn)的次數(shù),然后按出現(xiàn)次數(shù)做快速/堆/歸并排序就可以了。方案3:與方案1類似,但在做完hash,分成多個(gè)文件后,可以交給多個(gè)文件來處理,采用分布式的架構(gòu)來處理(比如MapReduce),最后再進(jìn)行合并。3. 有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過16字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100個(gè)詞。方案1:順序讀文件中,對(duì)

5、于每個(gè)詞x,取,然后按照該值存到5000 個(gè)小文件(記為)中。這樣每個(gè)文件大概是 200k左右。如果其中的有的文件超過了1M大小,還可以按照類似的方法繼續(xù)往下分,知道分解得到的小文件的大小都不超過1M。對(duì)每個(gè)小文件,統(tǒng)計(jì)每個(gè)文 件中出現(xiàn)的詞以及相應(yīng)的頻率(可以采用trie樹/hash_map等),并取出出現(xiàn)頻率最大的100個(gè)詞(可以用含100個(gè)結(jié)點(diǎn)的最小堆),并把100 詞及相應(yīng)的頻率存入文件,這樣又得到了5000個(gè)文件。下一步就是把這5000個(gè)文件進(jìn)行歸并(類似與歸并排序)的過程了。4. 海量日志數(shù)據(jù),提取出某日訪問百度次數(shù)最多的那個(gè)IP。方案1:首先是這一天,并且是訪問百度的日志中的IP取

6、出來,逐個(gè)寫入到一個(gè)大文件中。注意到IP是32位的,最多有個(gè)IP。同樣可以采用映射的 方法,比如模1000,把整個(gè)大文件映射為1000個(gè)小文件,再找出每個(gè)小文中出現(xiàn)頻率最大的IP(可以采用hash_map進(jìn)行頻率統(tǒng)計(jì),然后再找出頻 率最大的幾個(gè))及相應(yīng)的頻率。然后再在這1000個(gè)最大的IP中,找出那個(gè)頻率最大的IP,即為所求。5. 在2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù),內(nèi)存不足以容納這2.5億個(gè)整數(shù)。方案1:采用2-Bitmap(每個(gè)數(shù)分配2bit,00表示不存在,01表示出現(xiàn)一次,10表示多次,11無意義)進(jìn)行,共需內(nèi)存內(nèi)存,還可以接受。然后掃 描這2.5億個(gè)整數(shù),查看Bitmap中相對(duì)應(yīng)位,

7、如果是00變01,01變10,10保持不變。所描完事后,查看bitmap,把對(duì)應(yīng)位是01的整數(shù)輸 出即可。方案2:也可采用上題類似的方法,進(jìn)行劃分小文件的方法。然后在小文件中找出不重復(fù)的整數(shù),并排序。然后再進(jìn)行歸并,注意去除重復(fù)的元素。6. 海量數(shù)據(jù)分布在100臺(tái)電腦中,想個(gè)辦法高校統(tǒng)計(jì)出這批數(shù)據(jù)的TOP10。方案1:s 在每臺(tái)電腦上求出TOP10,可以采用包含10個(gè)元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我們首先取前 10個(gè)元素調(diào)整成最小堆,如果發(fā)現(xiàn),然后掃描后面的數(shù)據(jù),并與堆頂元素比較,如果比堆頂元素大,那么用該元素替換堆頂,然后再調(diào)整為最小堆。

8、最后堆中的元 素就是TOP10大。s 求出每臺(tái)電腦上的TOP10后,然后把這100臺(tái)電腦上的TOP10組合起來,共1000個(gè)數(shù)據(jù),再利用上面類似的方法求出TOP10就可以了。7. 怎么在海量數(shù)據(jù)中找出重復(fù)次數(shù)最多的一個(gè)?方案1:先做hash,然后求模映射為小文件,求出每個(gè)小文件中重復(fù)次數(shù)最多的一個(gè),并記錄重復(fù)次數(shù)。然后找出上一步求出的數(shù)據(jù)中重復(fù)次數(shù)最多的一 個(gè)就是所求(具體參考前面的題)。8. 上千萬或上億數(shù)據(jù)(有重復(fù)),統(tǒng)計(jì)其中出現(xiàn)次數(shù)最多的錢N個(gè)數(shù)據(jù)。方案1:上千萬或上億的數(shù)據(jù),現(xiàn)在的機(jī)器的內(nèi)存應(yīng)該能存下。所以考慮采用hash_map/搜索二叉樹/紅黑樹等來進(jìn)行統(tǒng)計(jì)次數(shù)。然后就是取出前N

9、個(gè)出現(xiàn)次數(shù)最多的數(shù)據(jù)了,可以用第6題提到的堆機(jī)制完成。9. 1000萬字符串,其中有些是重復(fù)的,需要把重復(fù)的全部去掉,保留沒有重復(fù)的字符串。請(qǐng)?jiān)趺丛O(shè)計(jì)和實(shí)現(xiàn)?方案1:這題用trie樹比較合適,hash_map也應(yīng)該能行。10. 一個(gè)文本文件,大約有一萬行,每行一個(gè)詞,要求統(tǒng)計(jì)出其中最頻繁出現(xiàn)的前10個(gè)詞,請(qǐng)給出思想,給出時(shí)間復(fù)雜度分析。方案1:這題是考慮時(shí)間效率。用trie樹統(tǒng)計(jì)每個(gè)詞出現(xiàn)的次數(shù),時(shí)間復(fù)雜度是O(n*le)(le表示單詞的平準(zhǔn)長(zhǎng)度)。然后是找出出現(xiàn)最頻繁的 前10個(gè)詞,可以用堆來實(shí)現(xiàn),前面的題中已經(jīng)講到了,時(shí)間復(fù)雜度是O(n*lg10)。所以總的時(shí)間復(fù)雜度,是O(n*le)與O

10、(n*lg10)中較大 的哪一個(gè)。11. 一個(gè)文本文件,找出前10個(gè)經(jīng)常出現(xiàn)的詞,但這次文件比較長(zhǎng),說是上億行或十億行,總之無法一次讀入內(nèi)存,問最優(yōu)解。方案1:首先根據(jù)用hash并求模,將文件分解為多個(gè)小文件,對(duì)于單個(gè)文件利用上題的方法求出每個(gè)文件件中10個(gè)最常出現(xiàn)的詞。然后再進(jìn)行歸并處 理,找出最終的10個(gè)最常出現(xiàn)的詞。12. 100w個(gè)數(shù)中找出最大的100個(gè)數(shù)。方案1:在前面的題中,我們已經(jīng)提到了,用一個(gè)含100個(gè)元素的最小堆完成。復(fù)雜度為O(100w*lg100)。方案2:采用快速排序的思想,每次分割之后只考慮比軸大的一部分,知道比軸大的一部分在比100多的時(shí)候,采用傳統(tǒng)排序算法排序,取

11、前100個(gè)。復(fù) 雜度為O(100w*100)。方案3:采用局部淘汰法。選取前100個(gè)元素,并排序,記為序列L。然后一次掃描剩余的元素x,與排好序的100個(gè)元素中最小的元素比,如果比這個(gè) 最小的要大,那么把這個(gè)最小的元素刪除,并把x利用插入排序的思想,插入到序列L中。依次循環(huán),知道掃描了所有的元素。復(fù)雜度為O(100w*100)。13. 尋找熱門查詢:搜索引擎會(huì)通過日志文件把用戶每次檢索使用的所有檢索串都記錄下來,每個(gè)查詢串的長(zhǎng)度為1-255字節(jié)。假設(shè)目前有一千萬個(gè)記錄,這些查詢串的重復(fù) 讀比較高,雖然總數(shù)是1千萬,但是如果去除重復(fù)和,不超過3百萬個(gè)。一個(gè)查詢串的重復(fù)度越高,說明查詢它的用戶越多

12、,也就越熱門。請(qǐng)你統(tǒng)計(jì)最熱門的10個(gè) 查詢串,要求使用的內(nèi)存不能超過1G。(1) 請(qǐng)描述你解決這個(gè)問題的思路;(2) 請(qǐng)給出主要的處理流程,算法,以及算法的復(fù)雜度。方案1:采用trie樹,關(guān)鍵字域存該查詢串出現(xiàn)的次數(shù),沒有出現(xiàn)為0。最后用10個(gè)元素的最小推來對(duì)出現(xiàn)頻率進(jìn)行排序。14. 一共有N個(gè)機(jī)器,每個(gè)機(jī)器上有N個(gè)數(shù)。每個(gè)機(jī)器最多存O(N)個(gè)數(shù)并對(duì)它們操作。如何找到個(gè)數(shù)中的中數(shù)?方案1:先大體估計(jì)一下這些數(shù)的范圍,比如這里假設(shè)這些數(shù)都是32位無符號(hào)整數(shù)(共有個(gè))。我們把0到的整數(shù)劃分為N個(gè)范圍段,每 個(gè)段包含個(gè)整數(shù)。比如,第一個(gè)段位0 到,第二段為到,第N個(gè)段為到。然后,掃描每個(gè)機(jī)器 上的N

13、個(gè)數(shù),把屬于第一個(gè)區(qū)段的數(shù)放到第一個(gè)機(jī)器上,屬于第二個(gè)區(qū)段的數(shù)放到第二個(gè)機(jī)器上,屬于第N個(gè)區(qū)段的數(shù)放到第N個(gè)機(jī)器上。注意這個(gè)過程每個(gè)機(jī) 器上存儲(chǔ)的數(shù)應(yīng)該是O(N)的。下面我們依次統(tǒng)計(jì)每個(gè)機(jī)器上數(shù)的個(gè)數(shù),一次累加,直到找到第k個(gè)機(jī)器,在該機(jī)器上累加的數(shù)大于或等于,而在第k-1個(gè)機(jī)器上的累 加數(shù)小于,并把這個(gè)數(shù)記為x。 那么我們要找的中位數(shù)在第k個(gè)機(jī)器中,排在第位。然后我們對(duì)第k個(gè)機(jī)器的 數(shù)排序,并找出第個(gè)數(shù),即為所求的中位 數(shù)。復(fù)雜度是的。方案2:先對(duì)每臺(tái)機(jī)器上的數(shù)進(jìn)行排序。排好序后,我們采用歸并排序的思想,將這N個(gè)機(jī)器上的數(shù)歸并起來得到最終的排序。找到第個(gè)便是所求。復(fù)雜度是的。15. 最大間隙

14、問題給定n個(gè)實(shí)數(shù),求著n個(gè)實(shí)數(shù)在實(shí)軸上向量 2個(gè)數(shù)之間的最大差值,要求線性的時(shí)間算法。方案1:最先想到的方法就是先對(duì)這n個(gè)數(shù)據(jù)進(jìn)行排序,然后一遍掃描即可確定相鄰的最大間隙。但該方法不能滿足線性時(shí)間的要求。故采取如下方法:s 找到n個(gè)數(shù)據(jù)中最大和最小數(shù)據(jù)max和min。s 用n-2個(gè)點(diǎn)等分區(qū)間min, max,即將min, max等分為n-1個(gè)區(qū)間(前閉后開區(qū)間),將這些區(qū)間看作桶,編號(hào)為,且桶的上界和桶i+1的下屆相同, 即每個(gè)桶的大小相同。每個(gè)桶的大小為:。實(shí)際上,這些桶的邊界構(gòu) 成了一個(gè)等差數(shù)列(首項(xiàng)為min,公差為),且認(rèn)為將min放入第一 個(gè)桶,將max放入第n-1個(gè)桶。s 將n個(gè)數(shù)放

15、入n-1個(gè)桶中:將每個(gè)元素分配到某個(gè)桶(編號(hào)為 index),其中,并求出分到每個(gè)桶的最大 最小數(shù)據(jù)。s 最大間隙:除最大最小數(shù)據(jù)max和min以外的n-2個(gè)數(shù)據(jù)放入n-1個(gè)桶中,由抽屜原理可知至少有一個(gè)桶是空的,又因?yàn)槊總€(gè)桶的大小相同,所以最大間隙 不會(huì)在同一桶中出現(xiàn),一定是某個(gè)桶的上界和氣候某個(gè)桶的下界之間隙,且該量筒之間的桶(即便好在該連個(gè)便好之間的桶)一定是空桶。也就是說,最大間隙在桶 i的上界和桶j的下界之間產(chǎn)生。一遍掃描即可完成。16. 將多個(gè)集合合并成沒有交集的集合:給定一個(gè)字符串的集合,格式如:。要求將其中交集不為空的 集合合并,要求合并完成的集合之間無交集,例如上例應(yīng)輸出。(

16、1) 請(qǐng)描述你解決這個(gè)問題的思路;(2) 給出主要的處理流程,算法,以及算法的復(fù)雜度;(3) 請(qǐng)描述可能的改進(jìn)。方案1:采用并查集。首先所有的字符串都在單獨(dú)的并查集中。然后依掃描每個(gè)集合,順序合并將兩個(gè)相鄰元素合并。例如,對(duì)于,首先查看aaa和bbb是 否在同一個(gè)并查集中,如果不在,那么把它們所在的并查集合并,然后再看bbb和ccc是否在同一個(gè)并查集中,如果不在,那么也把它們所在的并查集合并。接 下來再掃描其他的集合,當(dāng)所有的集合都掃描完了,并查集代表的集合便是所求。復(fù)雜度應(yīng)該是O(NlgN)的。改進(jìn)的話,首先可以記錄每個(gè)節(jié)點(diǎn)的根結(jié)點(diǎn),改 進(jìn)查詢。合并的時(shí)候,可以把大的和小的進(jìn)行合,這樣也減少

17、復(fù)雜度。17. 最大子序列與最大子矩陣問題數(shù)組的最大子序列問題:給定一個(gè)數(shù)組,其中元素有正,也有負(fù),找出其中一個(gè)連續(xù)子序列,使和最大。方案1:這個(gè)問題可以動(dòng)態(tài)規(guī)劃的思想解決。設(shè)表示以第i個(gè)元素結(jié)尾的最大子序列,那么顯然?;谶@一點(diǎn)可以很快用代 碼實(shí)現(xiàn)。最大子矩陣問題:給定一個(gè)矩陣(二維數(shù)組),其中數(shù)據(jù)有大有小,請(qǐng)找一個(gè)子矩陣,使得子矩陣的和最大,并輸出這個(gè)和。方案1:可以采用與最大子序列類似的思想來解決。如果我們確定了選擇第i列和第j列之間的元素,那么在這個(gè)范圍內(nèi),其實(shí)就是一個(gè)最大子序列問題。如 何確定第i列和第j列可以詞用暴搜的方法進(jìn)行。海量數(shù)據(jù)處理方法總結(jié)(轉(zhuǎn))2010-05-23 19:

18、47大數(shù)據(jù)量的問題是很多面試筆試中經(jīng)常出現(xiàn)的問題,比如baidu google 騰訊 這樣的一些涉及到海量數(shù)據(jù)的公司經(jīng)常會(huì)問到。下面的方法是我對(duì)海量數(shù)據(jù)的處理方法進(jìn)行了一個(gè)一般性的總結(jié),當(dāng)然這些方法可能并不能完全覆蓋所有的問題,但是這樣的一些方法也基本可以處理絕大多數(shù)遇到的問題。下面的一些問題基本直接來源于公司的面試筆試題目,方法不一定最優(yōu),如果你有更好的處理方法,歡迎與我討論。1.Bloom filter適用范圍:可以用來實(shí)現(xiàn)數(shù)據(jù)字典,進(jìn)行數(shù)據(jù)的判重,或者集合求交集基本原理及要點(diǎn): 對(duì)于原理來說很簡(jiǎn)單,位數(shù)組+k個(gè)獨(dú)立hash函數(shù)。將hash函數(shù)對(duì)應(yīng)的值的位數(shù)組置1,查找時(shí)如果發(fā)現(xiàn)所有has

19、h函數(shù)對(duì)應(yīng)位都是1說明存在,很明顯這個(gè)過程并不保證查找的結(jié)果是100%正確的。同時(shí)也不支持刪除一個(gè)已經(jīng)插入的關(guān)鍵字,因?yàn)樵撽P(guān)鍵字對(duì)應(yīng)的位會(huì)牽動(dòng)到其他的關(guān)鍵字。所以一個(gè)簡(jiǎn)單的改進(jìn)就是 counting Bloom filter,用一個(gè)counter數(shù)組代替位數(shù)組,就可以支持刪除了。還有一個(gè)比較重要的問題,如何根據(jù)輸入元素個(gè)數(shù)n,確定位數(shù)組m的大小及hash函數(shù)個(gè)數(shù)。當(dāng)hash函數(shù)個(gè)數(shù)k=(ln2)*(m/n)時(shí)錯(cuò)誤率最小。在錯(cuò)誤率不大于E的情況下,m至少要等于n*lg(1/E)才能表示任意n個(gè)元素的集合。但m還應(yīng)該更大些,因?yàn)檫€要保證bit數(shù)組里至少一半為0,則m應(yīng)該=nlg(1/E)*lge

20、大概就是nlg(1/E)1.44倍(lg表示以2為底的對(duì)數(shù))。舉個(gè)例子我們假設(shè)錯(cuò)誤率為0.01,則此時(shí)m應(yīng)大概是n的13倍。這樣k大概是8個(gè)。注意這里m與n的單位不同,m是bit為單位,而n則是以元素個(gè)數(shù)為單位(準(zhǔn)確的說是不同元素的個(gè)數(shù))。通常單個(gè)元素的長(zhǎng)度都是有很多bit的。所以使用bloom filter內(nèi)存上通常都是節(jié)省的。擴(kuò)展: Bloom filter將集合中的元素映射到位數(shù)組中,用k(k為哈希函數(shù)個(gè)數(shù))個(gè)映射位是否全1表示元素在不在這個(gè)集合中。Counting bloom filter(CBF)將位數(shù)組中的每一位擴(kuò)展為一個(gè)counter,從而支持了元素的刪除操作。Spectral

21、Bloom Filter(SBF)將其與集合元素的出現(xiàn)次數(shù)關(guān)聯(lián)。SBF采用counter中的最小值來近似表示元素的出現(xiàn)頻率。問題實(shí)例:給你A,B兩個(gè)文件,各存放50億條URL,每條URL占用64字節(jié),內(nèi)存限制是4G,讓你找出A,B文件共同的URL。如果是三個(gè)乃至n個(gè)文件呢?根據(jù)這個(gè)問題我們來計(jì)算下內(nèi)存的占用,4G=232大概是40億*8大概是340億,n=50億,如果按出錯(cuò)率0.01算需要的大概是650億個(gè)bit。現(xiàn)在可用的是340億,相差并不多,這樣可能會(huì)使出錯(cuò)率上升些。另外如果這些urlip是一一對(duì)應(yīng)的,就可以轉(zhuǎn)換成ip,則大大簡(jiǎn)單了。2.Hashing適用范圍:快速查找,刪除的基本數(shù)據(jù)結(jié)

22、構(gòu),通常需要總數(shù)據(jù)量可以放入內(nèi)存基本原理及要點(diǎn): hash函數(shù)選擇,針對(duì)字符串,整數(shù),排列,具體相應(yīng)的hash方法。 碰撞處理,一種是open hashing,也稱為拉鏈法;另一種就是closed hashing,也稱開地址法,opened addressing。擴(kuò)展: d-left hashing中的d是多個(gè)的意思,我們先簡(jiǎn)化這個(gè)問題,看一看2-left hashing。2-left hashing指的是將一個(gè)哈希表分成長(zhǎng)度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個(gè)哈希函數(shù),h1和h2。在存儲(chǔ)一個(gè)新的key時(shí),同時(shí)用兩個(gè)哈希函數(shù)進(jìn)行計(jì)算,得出兩個(gè)地址h1key和h2key。這時(shí)

23、需要檢查T1中的h1key位置和T2中的h2key位置,哪一個(gè)位置已經(jīng)存儲(chǔ)的(有碰撞的)key比較多,然后將新key存儲(chǔ)在負(fù)載少的位置。如果兩邊一樣多,比如兩個(gè)位置都為空或者都存儲(chǔ)了一個(gè)key,就把新key 存儲(chǔ)在左邊的T1子表中,2-left也由此而來。在查找一個(gè)key時(shí),必須進(jìn)行兩次hash,同時(shí)查找兩個(gè)位置。問題實(shí)例: 1).海量日志數(shù)據(jù),提取出某日訪問百度次數(shù)最多的那個(gè)IP。IP的數(shù)目還是有限的,最多232個(gè),所以可以考慮使用hash將ip直接存入內(nèi)存,然后進(jìn)行統(tǒng)計(jì)。3.bit-map適用范圍:可進(jìn)行數(shù)據(jù)的快速查找,判重,刪除,一般來說數(shù)據(jù)范圍是int的10倍以下基本原理及要點(diǎn):使用b

24、it數(shù)組來表示某些元素是否存在,比如8位電話號(hào)碼擴(kuò)展:bloom filter可以看做是對(duì)bit-map的擴(kuò)展問題實(shí)例:1)已知某個(gè)文件內(nèi)包含一些電話號(hào)碼,每個(gè)號(hào)碼為8位數(shù)字,統(tǒng)計(jì)不同號(hào)碼的個(gè)數(shù)。8位最多99 999 999,大概需要99m個(gè)bit,大概10幾m字節(jié)的內(nèi)存即可。2)2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù)的個(gè)數(shù),內(nèi)存空間不足以容納這2.5億個(gè)整數(shù)。將bit-map擴(kuò)展一下,用2bit表示一個(gè)數(shù)即可,0表示未出現(xiàn),1表示出現(xiàn)一次,2表示出現(xiàn)2次及以上。或者我們不用2bit來進(jìn)行表示,我們用兩個(gè)bit-map即可模擬實(shí)現(xiàn)這個(gè)2bit-map。4.堆適用范圍:海量數(shù)據(jù)前n大,并且n比較小,堆

25、可以放入內(nèi)存基本原理及要點(diǎn):最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當(dāng)前元素與最大堆里的最大元素,如果它小于最大元素,則應(yīng)該替換那個(gè)最大元素。這樣最后得到的n個(gè)元素就是最小的n個(gè)。適合大數(shù)據(jù)量,求前n小,n的大小比較小的情況,這樣可以掃描一遍即可得到所有的前n元素,效率很高。擴(kuò)展:雙堆,一個(gè)最大堆與一個(gè)最小堆結(jié)合,可以用來維護(hù)中位數(shù)。問題實(shí)例: 1)100w個(gè)數(shù)中找最大的前100個(gè)數(shù)。用一個(gè)100個(gè)元素大小的最小堆即可。5.雙層桶劃分適用范圍:第k大,中位數(shù),不重復(fù)或重復(fù)的數(shù)字基本原理及要點(diǎn):因?yàn)樵胤秶艽?,不能利用直接尋址表,所以通過多次劃分,逐步確定范圍,然后最后在一

26、個(gè)可以接受的范圍內(nèi)進(jìn)行??梢酝ㄟ^多次縮小,雙層只是一個(gè)例子。擴(kuò)展:?jiǎn)栴}實(shí)例: 1).2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù)的個(gè)數(shù),內(nèi)存空間不足以容納這2.5億個(gè)整數(shù)。有點(diǎn)像鴿巢原理,整數(shù)個(gè)數(shù)為232,也就是,我們可以將這232個(gè)數(shù),劃分為28個(gè)區(qū)域(比如用單個(gè)文件代表一個(gè)區(qū)域),然后將數(shù)據(jù)分離到不同的區(qū)域,然后不同的區(qū)域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁盤空間,就可以很方便的解決。2).5億個(gè)int找它們的中位數(shù)。這個(gè)例子比上面那個(gè)更明顯。首先我們將int劃分為216個(gè)區(qū)域,然后讀取數(shù)據(jù)統(tǒng)計(jì)落到各個(gè)區(qū)域里的數(shù)的個(gè)數(shù),之后我們根據(jù)統(tǒng)計(jì)結(jié)果就可以判斷中位數(shù)落到那個(gè)區(qū)域,同時(shí)知道這

27、個(gè)區(qū)域中的第幾大數(shù)剛好是中位數(shù)。然后第二次掃描我們只統(tǒng)計(jì)落在這個(gè)區(qū)域中的那些數(shù)就可以了。實(shí)際上,如果不是int是int64,我們可以經(jīng)過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成224個(gè)區(qū)域,然后確定區(qū)域的第幾大數(shù),在將該區(qū)域分成220個(gè)子區(qū)域,然后確定是子區(qū)域的第幾大數(shù),然后子區(qū)域里的數(shù)的個(gè)數(shù)只有220,就可以直接利用direct addr table進(jìn)行統(tǒng)計(jì)了。6.數(shù)據(jù)庫索引適用范圍:大數(shù)據(jù)量的增刪改查基本原理及要點(diǎn):利用數(shù)據(jù)的設(shè)計(jì)實(shí)現(xiàn)方法,對(duì)海量數(shù)據(jù)的增刪改查進(jìn)行處理。 擴(kuò)展: 問題實(shí)例:7.倒排索引(Inverted index)適用范圍:搜索引擎,關(guān)鍵字查詢基本

28、原理及要點(diǎn):為何叫倒排索引?一種索引方法,被用來存儲(chǔ)在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲(chǔ)位置的映射。以英文為例,下面是要被索引的文本: T0 = it is what it is T1 = what is it T2 = it is a banana 我們就能得到下面的反向文件索引: a: 2 banana: 2 is: 0, 1, 2 it: 0, 1, 2 what: 0, 1 檢索的條件what, is 和 it 將對(duì)應(yīng)集合的交集。正向索引開發(fā)出來用來存儲(chǔ)每個(gè)文檔的單詞的列表。正向索引的查詢往往滿足每個(gè)文檔有序頻繁的全文查詢和每個(gè)單詞在校驗(yàn)文檔中的驗(yàn)證這樣的查詢。在正向索引

29、中,文檔占據(jù)了中心的位置,每個(gè)文檔指向了一個(gè)它所包含的索引項(xiàng)的序列。也就是說文檔指向了它包含的那些單詞,而反向索引則是單詞指向了包含它的文檔,很容易看到這個(gè)反向的關(guān)系。擴(kuò)展:?jiǎn)栴}實(shí)例:文檔檢索系統(tǒng),查詢那些文件包含了某單詞,比如常見的學(xué)術(shù)論文的關(guān)鍵字搜索。8.外排序適用范圍:大數(shù)據(jù)的排序,去重基本原理及要點(diǎn):外排序的歸并方法,置換選擇 敗者樹原理,最優(yōu)歸并樹擴(kuò)展:?jiǎn)栴}實(shí)例: 1).有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過16個(gè)字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100個(gè)詞。這個(gè)數(shù)據(jù)具有很明顯的特點(diǎn),詞的大小為16個(gè)字節(jié),但是內(nèi)存只有1m做hash有些不夠,所以可以用來排

30、序。內(nèi)存可以當(dāng)輸入緩沖區(qū)使用。9.trie樹適用范圍:數(shù)據(jù)量大,重復(fù)多,但是數(shù)據(jù)種類小可以放入內(nèi)存基本原理及要點(diǎn):實(shí)現(xiàn)方式,節(jié)點(diǎn)孩子的表示方式擴(kuò)展:壓縮實(shí)現(xiàn)。問題實(shí)例: 1).有10個(gè)文件,每個(gè)文件1G, 每個(gè)文件的每一行都存放的是用戶的query,每個(gè)文件的query都可能重復(fù)。要你按照query的頻度排序 。2).1000萬字符串,其中有些是相同的(重復(fù)),需要把重復(fù)的全部去掉,保留沒有重復(fù)的字符串。請(qǐng)問怎么設(shè)計(jì)和實(shí)現(xiàn)?3).尋找熱門查詢:查詢串的重復(fù)度比較高,雖然總數(shù)是1千萬,但如果除去重復(fù)后,不超過3百萬個(gè),每個(gè)不超過255字節(jié)。10.分布式處理 mapreduce適用范圍:數(shù)據(jù)量大,

31、但是數(shù)據(jù)種類小可以放入內(nèi)存基本原理及要點(diǎn):將數(shù)據(jù)交給不同的機(jī)器去處理,數(shù)據(jù)劃分,結(jié)果歸約。擴(kuò)展:?jiǎn)栴}實(shí)例:1).The canonical example application of MapReduce is a process to count the appearances ofeach different word in a set of documents: void map(String name, String document): / name: document name / document: document contents for each word w in doc

32、ument: EmitIntermediate(w, 1); void reduce(String word, Iterator partialCounts): / key: a word / values: a list of aggregated partial counts int result = 0; for each v in partialCounts: result += ParseInt(v); Emit(result); Here, each document is split in words, and each word is counted initially wit

33、h a 1 value bythe Map function, using the word as the result key. The framework puts together all the pairswith the same key and feeds them to the same call to Reduce, thus this function just needs tosum all of its input values to find the total appearances of that word.2).海量數(shù)據(jù)分布在100臺(tái)電腦中,想個(gè)辦法高效統(tǒng)計(jì)出這批數(shù)據(jù)的TOP10。3).一共有N個(gè)機(jī)器,每個(gè)機(jī)器上有N個(gè)數(shù)。每個(gè)機(jī)器最多存O(N)個(gè)數(shù)并對(duì)它們操作。如何找到N2個(gè)數(shù)的中數(shù)(median)?經(jīng)典問題分析上千萬or億數(shù)據(jù)(有重復(fù)),統(tǒng)計(jì)其中出現(xiàn)次數(shù)最多的前N個(gè)數(shù)據(jù),分兩種情況:可一次讀入內(nèi)存,不可一次讀入。可用思路:trie樹+堆

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論