首先看到100g的日誌檔案,我們的第一反應肯定是太大了,根本載入不到記憶體,更別說設計演算法了,那麼怎麼辦呢?既然裝不下,我們是不是可以將其切分開來,一小部分一小部分輪流進入記憶體呢,答案當然是肯定的。
在這裡要記住一點:但凡是大資料的問題,都可通過切分來解決它。
粗略算一下:如果我們將其分成1000個小檔案,每個檔案大概就是500m左右的樣子,現在計算機肯定輕輕 鬆鬆就能裝下。
那麼,問題又來了,怎樣才能保證相同的ip被分到同乙個檔案中呢?
這裡我想到的是雜湊切分,使用相同的雜湊函式(如 bkdrhash)將所有ip位址轉換為乙個整數key,再利用 index=key%1000就可將相同ip分到同乙個檔案。
依次將這1000個檔案讀入記憶體,出現次數最多的ip進行統計。
最後,在1000個出現次數最多的ip中找出最大的出現次數即為所求。
用到的雜湊函式:
大資料求職必看:經典的大資料面試問題
大資料求職必看:經典的大資料面試問題
與上題條件相同,如何找到top k的ip?
答:這倒題說白了就是找前k個出現次數最多的ip,即降序排列ip出現的次數。
與上題類似,我們用雜湊切分對分割的第乙個個小檔案**現最多的前k個ip建小堆,
然後讀入第二個檔案,將其出現次數最多的前k個ip與 堆中資料進行對比,
如果包含大於堆中的ip出現次數,則更新小堆,替換原堆中次數的出現少的資料
再讀入第三個檔案,以此類推……
直到1000個檔案全部讀完,堆**現的k個ip即是出現 次數最多的前k個ip位址。
大資料求職必看:經典的大資料面試問題
給定100億個整數,設計演算法找到只出現一次的整數 ?
答:看到此題目,我的第一反應就是估算其占用記憶體的大小:100億個int,乙個int4個位元組,100億*4=400億位元組
又因為42億字節約等於4g,所以100億個整數大概占用的記憶體為40g,一次載入到記憶體顯然是不太現實的。
反過來想,所有整數所能表示的範圍為2^32,即16g, 故給出的資料有很多資料是重複的。
解法1:雜湊切分
與第一題類似,用雜湊切分將這些資料分到100個檔案 中,每個檔案大約400m,將每乙個檔案依次載入到記憶體中,利用雜湊表統計出現一次的整數,將100個檔案**現一次的整數彙總起來即為所求。
解法2:位圖變形
我們知道,點陣圖是利用每一位來表示乙個整數是否存在來節省空間,1表示存在,0表示不存在。
而上題對於所有整數而言,卻有三種狀態:不存在、 存在一次、存在多次。
故此,我們需要對傳統位圖進行擴充套件,用兩位來表示乙個整數的狀態:00表示不存在、01表示存在一次, 10表示存在多次,11表示無效狀態。
按照上述表示,兩位表示乙個整數狀態,所有整數只需要1g即可表示其存在與否。
解法3:
眾所周知,乙個整數佔32位,那麼我們可對每一位按照0和1將其分為兩個檔案,直到劃分到最低位,如果被分的檔案中哪個檔案只包含乙個資料,那麼,此資料即為只出現一次的整數。
如下圖:
大資料求職必看:經典的大資料面試問題
大資料求職必看:經典的大資料面試問題
給兩個檔案,分別有100億個整數,我們只有1g記憶體 ,如何找到兩個檔案交集?
答:100億4位元組 = 400億位元組 = 40g
解法1:普通查詢
將其中的乙個檔案分為100個小檔案,每乙份佔400m, 將每一小份輪流加到記憶體中,與第二個檔案中的資料進行對比,找到交集。此種算 法時間複雜度為o(nn)。
解法2:雜湊切分
對兩個檔案分別進行雜湊切分,將其分為100個小檔案 ,index=key%100(index為檔案下標)。
將兩個檔案中下標相同的小檔案進行對比,找出其交集。將100個檔案的交集彙總起來即為所給檔案的檔案交集 。此種演算法時間複雜度為o(n)。
解法3:位圖
我們知道,點陣圖中的每一位就可代表乙個整數的存在與否,而16g的整數用位圖512m即可表示,將第乙個檔案中的整數對映到位圖中去拿第二個檔案中的數字到第乙個檔案對映的點陣圖中去對比,相同數字存在即為交集。此種演算法時間複雜度為o(n)。
注意:重複出現的數字交集中只會出現一次。
點陣圖的簡單模擬:
大資料求職必看:經典的大資料面試問題
執行結果:
大資料求職必看:經典的大資料面試問題
大資料求職必看:經典的大資料面試問題
1個檔案有100億個int,1g記憶體,設計演算法找到出現次數不超過兩次的所有整數?
答:此題思路類似第三題。
解法1:雜湊切分
與第一題類似,用雜湊切分將這些資料分到100個檔案中,每個檔案大約400m,
將每乙個檔案依次載入到記憶體中,利用雜湊表統計出現不超過兩次的整數
將100個檔案**現不超過兩次的整數彙總起來即為所求。
解法2:位圖變形
我們知道,點陣圖是利用每一位來表示乙個整數是否存在來節省空間,1表示存在,0表示不存在。
而上題對於所有整數而言,卻有三種狀態:不存在、 存在一次、存在多次。
故此,我們需要對傳統位圖進行擴充套件,用兩位來表示乙個整數的狀態:00表示不存在、
01表示存在一次, 10表示存在兩次,11表示出現超過兩次。
按照上述表示,兩位表示乙個整數狀態,所有整數只需要1g即可表示其存在次數。
大資料求職必看:經典的大資料面試問題
給兩個檔案,分別有100億個query,我們只有1g記憶體,如何找到兩個檔案交集?分別給出精確演算法和近似演算法。
答:這道題思路類似於第四題:100億*4位元組 = 400億位元組 = 40g。
精確演算法:雜湊切分
對兩個檔案分別進行雜湊切分,使用相同的雜湊函式 (如 bkdrhash雜湊函式)將所有query轉換為乙個整數key ,再利用 index=key%1000就可將相同query分到同一 個檔案。(index為檔案下標)
將兩個檔案中下標相同的小檔案進行對比,找出其交集。
將100個檔案的交集彙總起來即為所給檔案的檔案交集 。此種演算法時間複雜度為o(n)。
近似演算法:布隆過濾器
首先使用相同的雜湊函式(如 bkdrhash雜湊函式)將所有 query轉換為乙個整數key,
又因為布隆過濾器中的每 一位就可代表乙個整數的存在 與否,而16g的整數用位圖512m即可表示,
將第乙個檔案中的整數對映到位圖中去,
拿第二個檔案中的數字到第乙個檔案對映的點陣圖中去對比,相同數字存在即為交集。
此種演算法時間複雜度為o(n)。
注意:布隆過濾器判斷不存在是確定的,而存存在在可能導致誤判,所以稱近似演算法。
布隆過濾器的簡單模擬:
各種不同的雜湊函式:
大資料求職必看:經典的大資料面試問題
布隆過濾器:
大資料求職必看:經典的大資料面試問題
測試函式:
大資料求職必看:經典的大資料面試問題
執行結果:
大資料求職必看:經典的大資料面試問題
大資料求職必看:經典的大資料面試問題
如何擴充套件bloomfilter使得它支援刪除元素的操作?
答:因為乙個布隆過濾器的key對應多個為位,衝突的概率比較大,所以不支援刪除,因為刪除有可能影響到其他元素。如果要對其元素進行刪除,就不得不對每乙個位進行引用計數,同下題。
大資料求職必看:經典的大資料面試問題
如何擴充套件bloomfilter使得它支援計數的操作?
答:我們都知道,位圖非常的節省空間,但由於每一位都要引入乙個int,所以空間浪費還是比較嚴重的, 因此不得不放棄點陣圖了,**如下:
大資料求職必看:經典的大資料面試問題
大資料求職必看:經典的大資料面試問題
給上千個檔案,每乙個檔案大小為1k-100m,給n個單 詞,設計演算法對每個詞找到所有包含它的檔案,你只 有100k記憶體。
答:對上千個檔案生成1000個布隆過濾器,並將1000個布隆過濾器存入乙個檔案中,將記憶體分為兩份,乙份用來讀取布隆過濾器中的詞,乙份用來讀取檔案, 直到每個布隆過濾器讀完為止。
用乙個檔案info 準備用來儲存n個詞和包含其的檔案資訊。
首先把n個詞分成x份。對每乙份用生成乙個布隆過濾器(因為對n個詞只生成乙個布隆過濾器,記憶體可能不夠用)。把生成的所有布隆過濾器存入外存 的乙個檔案filter中。
將記憶體分為兩塊緩衝區,一塊用於每次讀入乙個 布隆過濾器,乙個用於讀檔案(讀檔案這個緩衝區使用 相當於有界生產者消費者問題模型來實現同步),大文 件可以分為更小的檔案,但需要儲存大檔案的標示信 息(如這個小檔案是哪個大檔案的)。
對讀入的每乙個單詞用記憶體中的布隆過濾器來判 斷是否包含這個值,如果不包含,從filter檔案中讀 取下乙個布隆過濾器到記憶體,直到包含或遍歷完所有 布隆過濾器。如果包含,更新info 檔案。直到處理完 所有資料。刪除filter檔案。
大資料求職必看:經典的大資料面試問題
有乙個詞典,包含n個英文單詞,現在任意給乙個字串,設計演算法找出包含這個字串的所有英文單詞。
答:對於這道題目,我們要用到一種特殊的資料結構—-字典樹來解決它,所謂字典樹,又稱單詞查詢樹(或trie樹),是一種雜湊樹的變種。
典型應用:用於統計、排序和儲存大量的字串,經 常被搜尋引擎系統用於文字詞頻統計。
優點:利用字串的公共字首來減少查詢時間,最大 限度地減少無謂的字串比較,查詢效率高於雜湊表 。
基本性質:根節點不包含字元,除根節點外每個節點 都只包含乙個字元;
從根節點到某一節點,路徑上所有經過的字元連線起來,為該節點對應的字串;
每個節點的所有子節點包含的字元都不相同 。
應用:串的快速檢索、串排序、最長公共字首
解法如下:
用給出的n個單詞建立一棵與上述字典樹不同的字典樹 ,用任意字串與字典樹中的每個節點中的單詞進行 比較,在每層中查詢與任意字串首字母一樣的,找到則遍歷其下面的子樹,找第二個字母,以此類推, 如果與任意字串的字元全部相同,則算找到。
python經典面試題目
print set a set b a,b中相同的元素 print set a set b a,b中不同元素list 1 a b c b a list 1 list set list 1 print list 1 alist defsort by age alist return sorted al...
經典C 面試題目
1 在c 中,string str null 與 string str 請盡量使用文字或圖象說明其中的區別。回答要點 說明詳細的空間分配。10分 答 string str null 是不給他分配記憶體空間,而string str 給它分配長度為空字串的記憶體空間.請詳述在dotnet中類 class...
大資料 hadoop 經典面試題 三
輸入分片 inputsplit 在進行map計算之前,mapreduce會根據輸入檔案計算輸入分片 input split 每個輸入分片 input split 針對乙個map任務 儲存的並非資料本身,而是乙個分片長度和乙個記錄資料的位置的陣列,輸入分片 input split 往往和hdfs的bl...