1)給⼀個超過100g⼤⼩的log file, log中存著ip位址, 設計演算法找到出現次數最多的ip位址?
第一題:首先我們的思路就是利用雜湊進行檔案的切分,我們把100g大小的logfile分為1000份,那麼下來差不多沒乙個檔案就是100m左右,然後再利用雜湊函式除留餘數的方法分配到對應的編號檔案中,然後得出每個檔案中出現次數最多的ip,然後堆排序取得這1000個ip中出現次數最多的。
2)與上題條件相同,如何找到top k的ip?如何直接⽤linux系統命令實現?
這一道題的思路就是我們從題意可以看到這道題是來找top k的ip,topk我們的思路就是用堆來實現,找top,就需要用小堆,這個是根據對的資料特性,我們建立成小堆,然後每次和堆頂最小的進行比較,然後再次進行向上調整,最後,就可以得到乙個堆頂是最小ip,的乙個小堆,這個小堆就是我們需求的k個ip,需要建的是k個節點的堆。
3)給定100億個整數,設計演算法找到只出現⼀次的整數!
由於是整數,所以我們採取的思路就是我們可以採用位圖,100億個整數,大致就是需要1.25g的記憶體進行儲存。乙個數字必須要2個位來進行表示狀態,比如說,00表示不存在,01表示存在一次,10表示存在多次。這樣就可以全部表示出每乙個數存在的狀態,這裡我們就需要的記憶體是2.5g。
4)給兩個⽂件,分別有100億個整數,我們只有1g記憶體,如何找到兩個⽂件交集!
這個我們有多種思路,我們採用雜湊切分,100億個整數我們來切分為1000個檔案,這樣就有2000個檔案,然後我們進行雜湊演算法,a的100億個數根據餘數不同,對應存在a0檔案-a999檔案,這樣就完成了a的雜湊切分,然後我們對b進行雜湊切分,同樣的思想,分出1000個檔案,根據餘數的不同分配到b0-b999檔案中,這樣我們最後就進行簡單的對應編號的檔案之間的比對。這樣就能找到兩個檔案的交集
5)1個⽂件有100億個int,1g記憶體,設計演算法找到出現次數不超過2次的所有整數!
首先妖之道所有的int也就是42億9000萬多。所以這樣我們也就需要這麼些位來使用位圖,使用兩位位圖,每兩個位表示乙個狀態。對於42億9000萬多的位我們需要512m來儲存,所以對於兩位我們需要1g來儲存,然後找到對應狀態的數,統計出來就好了。
6)給兩個⽂件,分別有100億個query,我們只有1g記憶體,如何找到兩個⽂件交集?分別給出精確 演算法和近似演算法!
100億個quary,我們按照乙個quary是10個位元組算,那麼我們大概需要100億*10,下來大致需要100g容量
近似演算法:使用布隆,首先我們要知道,1g所對應的也就是80億個位,然後我們把100g的a先在1g上構造布隆,然後b和1g的進行布隆test。如果存在,那麼就是交集,這種演算法肯定會有差錯概率。
方案二,直接切分資料,然後進行1對多的查詢
比較的時間複雜度為o(n^2),
方案三,首先我們把100g容量切分成1000個檔案,然後對應的利用字串雜湊演算法求得整數和1000進行除留餘數,得道餘數後,分別把不同的query對應到不同的餘數編號的檔案中去,然後再對檔案進行編號相同的進行匹配,就可以找到交集。這個時候比較時間複雜度就降到了o(n)
7)如何擴充套件bloomfilter使得它⽀持刪除元素的操作?
如果要支援刪除,可以使用引用計數的方式,
8)如何擴充套件bloomfilter使得它⽀持計數操作?!
可以直接使用整形,這樣乙個位既可以表示它的狀態,而且也可以進行計數的統計。
9)給上千個⽂件,每個⽂件⼤⼩為1k—100m。給n個詞,設計演算法對每個詞找到所有包含它的⽂ 件,你只有100k記憶體!
0: 用乙個檔案info 準備用來儲存n個詞和包含其的檔案資訊。
1 : 首先把n個詞分成x份。對每乙份用生成乙個布隆過濾器(因為對n個詞只生成乙個布隆過濾器,記憶體可能不夠用)。把生成的所有布隆過濾器存入外存的乙個檔案filter中。
2:將記憶體分為兩塊緩衝區,一塊用於每次讀入乙個布隆過濾器,乙個用於讀檔案(讀檔案這個緩衝區使用相當於有界生產者消費者問題模型來實現同步),大檔案可以分為更小的檔案,但需要儲存大檔案的標示資訊(如這個小檔案是哪個大檔案的)。
3:對讀入的每乙個單詞用記憶體中的布隆過濾器來判斷是否包含這個值,如果不包含,從filter檔案中讀取下乙個布隆過濾器到記憶體,直到包含或遍歷完所有布隆過濾器。如果包含,更新info 檔案。直到處理完所有資料。刪除filter檔案。
10)有⼀個詞典,包含n個英⽂單詞,現在任意給⼀個字串,設計演算法找出包含這個字串的所有英⽂單詞。
利用字典樹可以進行計算,我們首先在字典樹上對應上單詞,然後用這個字串對應到字典樹中,這是在當記憶體很大的時候可以考慮的思路。
11) 搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。
假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。
這道題的思路就是:
第一步,首先進行記錄的統計,
我們可以採用兩種方法進行統計:
1.直接排序法,利用歸併排序,然後遍歷,這樣的時間複雜度就是o(n+nlogn)=o(nlogn)。
2.雜湊
我們也可以採用雜湊的方式來進行,我們使用key-value的結構,這樣就只需要遍歷一遍內容就好了,所以我們花費的時間複雜度就是o(n)。
第二個方法不只是在演算法時間複雜度上提高了,而且只需要對資料檔案開啟一次,這樣操作性更好。
第二步,找出topk
這裡也提供多個思路。
思路就是使用堆,我們可以通過建立小堆的方式,使用堆排序,找出top k個,時間複雜度是nlogn。
這樣我們的最終的時間複雜度就是o(n)+o(nlogn)
或者:採用trie樹,關鍵字域存該查詢串出現的次數,沒有出現為0。最後用10個元素的最小推來對出現頻率進行排序。
12)有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
這道題的思路是,因為記憶體限定很小,所以我們對這個1g的大檔案肯定要採用分治的思想,我們可以對這個檔案進行雜湊拆分,分為2000個檔案,那麼每個檔案就是500kb內容,我們這個時候對每個詞進行除留餘數,把詞存放到對應的檔案當中去,然後我們統計每個檔案中出現的詞和頻率,(採用trie樹/hash_map),然後利用小堆得出出現次數最多的100個詞,對於出現次數多的,然後我們把我詞和出現的頻率儲存在檔案當中,這樣下來,這2000個檔案當中就各有100個詞,然後對著2000個檔案再次進行歸併排序。找出其中頻數最高的100個詞。
13)有10個檔案,每個檔案1g,每個檔案的每一行存放的都是使用者的query,每個檔案的query都可能重複。要求你按照query的頻度排序。
方案1,
對於這一道題的思路來說我們進行查詢top k的演算法,我們在這裡首先讀取10個檔案,然後按照雜湊切分的思想把每個查詢寫入到另外的10個檔案當中。這樣生成的檔案每個也就大約1g。
找一台內存在2g左右的機器,依次對用hash_map(query, query_count)來統計每個query出現的次數。利用快速/堆/歸併排序按照出現次數進行排序。將排序好的query和對應的query_cout輸出到檔案中。這樣得到了10個排好序的檔案(記為)。
方案2:
一般query的總量是有限的,只是重複的次數比較多而已,可能對於所有的query,一次性就可以加入到記憶體了。這樣,我們就可以採用trie樹/hash_map等直接來統計每個query出現的次數,然後按出現次數做快速/堆/歸併排序就可以了。
方案3:
與方案1類似,但在做完hash,分成多個檔案後,可以交給多個檔案來處理,採用分布式的架構來處理(比如mapreduce),最後再進行合併。
14)、 給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?
4g記憶體對於320億位。
url所占用的3200億位元組,也就是320g,我們在這進行檔案分開儲存,切分成1000個檔案,乙個檔案就是320m左右,對應的url進行雜湊演算法,寫入對應的餘數編號檔案當中。把a和b都這樣做,然後進行編號相同的檔案進行匹配。最後得出共同的。
方法一:利用布隆,把a構建成乙個布隆,然後對應的和b進行test,test完以後就可以得到最後的共同的url
方法二,
15)、在2.5億個整數中找出不重複的整數,注,記憶體不足以容納這2.5億個整數。
採用點陣圖的方法,4g記憶體可以存320億位,所以絕對能夠儲存,然後我們需要理解的就是我們需要沒兩個位進行表示乙個整數,那麼,這樣就是00表示不存在,01表示存在1次,10表示出現多次的,這樣我們就能找出在2.5億中不重複出現的數了,我們呢需要用到5億個位。
16)、怎麼在海量資料中找出重複次數最多的乙個?
先做hash,然後求模對映為小檔案,求出每個小檔案中重複次數最多的乙個,並記錄重複次數。然後找出上一步求出的資料中重複次數最多的乙個就是所求,可以利用歸併排序。
17)、上千萬或上億資料(有重複),統計其中出現次數最多的錢n個資料。
先用hash_map,然後用堆去前n個資料
18)、乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間複雜度分析。
方案1:這題是考慮時間效率。用trie樹統計每個詞出現的次數,時間複雜度是o(n*le)(le表示單詞的平準長度)。然後是找出出現最頻繁的前10個詞,可以用堆來實現,前面的題中已經講到了,時間複雜度是o(n*lg10)。所以總的時間複雜度,是o(n*le)與o(n*lg10)中較大的哪乙個。
海量資料問題總結
這個是一系列問題,網際網路公司,一些基本的功能都已經做的很完善了,海量資料處理成為重點的問題,也是面試筆試中常考的題目。主要參考 1.分而治之 hash對映 hash統計 堆 快速 歸併排序 hash對映很重要,分類後的資料不會分散,某乙個類別的資料會全部在一起。用hash map統計的速度要比ma...
海量資料問題總結
這個是一系列問題,網際網路公司,一些基本的功能都已經做的很完善了,海量資料處理成為重點的問題,也是面試筆試中常考的題目。主要參考 1.分而治之 hash對映 hash統計 堆 快速 歸併排序 hash對映很重要,分類後的資料不會分散,某乙個類別的資料會全部在一起。用hash map統計的速度要比ma...
資料分析之海量資料處理
bitmap 桶注意 1gb 210 3 230 2 3 2 210 3 230 1073741824b 11億b 1.有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m,要求 返回頻數最高的100個詞。1 分而治之 hash對映 順序讀檔案中對於每個詞x取...