數據分析面試常見問題_第1頁
數據分析面試常見問題_第2頁
數據分析面試常見問題_第3頁
數據分析面試常見問題_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、數據分析面試常見問題1、海量日志數據,提取出某日訪問百度次數最多的那個IP。首先是這一天,并且是訪問百度的日志中的 IP 取出來,逐個寫入到一個大文件中。注意到IP是32位的,最多有個2A32個IP。同樣可以采用映射的方法,比如模1000,把整個大文件映射為1000個小文件,再找出每個小文中出現頻率最大的IP (可以采用hash_map進行頻率統計,然后再找出頻率最大的幾個)及相應的頻率。然后再在這1000 個最大的 IP中,找出那個頻率最大的IP,即為所求?;蛘呷缦玛U述:算法思想:分而治之 +Hash1.1 P地址最多有2A32=4G種取值情況,所以不能完全加載到內存中處理;2 .可以考慮采

2、用“分而治之”的思想,按照 IP地址的Hash(IP)24值,把海量IP日志分別存儲到1024個小文件中。這樣,每個小文件最多包含4MB個IP地址;3 .對于每一個小文件,可以構建一個IP為key,出現次數為 value的Hash map,同時記錄當前出現次數最多的那個IP 地址;4 .可以得到1024個小文件中的出現次數最多的IP,再依據常規的排序算法得到總體上出現次數最多的 IP;2、搜索引擎會通過日志文件把用戶每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為 1-255 字節。假設目前有一千萬個記錄 (這些查詢串的重復度比較高, 雖然總數是1 千萬, 但如果除去重復后, 不超過 3

3、 百萬個。一個查詢串的重復度越高, 說明查詢它的用戶越多, 也就是越熱門。 ) ,請你統計最熱門的 10 個查詢串,要求使用的內存不能超過1G。典型的Top K算法,還是在這篇文章里頭有所闡述,文中,給出的最終算法是:第一步、先對這批海量數據預處理,在 O (N)的時間內用 Hash表完成統計(之前寫成了排序,特此訂正。 July、 2011.04.27) ;第二步、借助堆這個數據結構,找出 Top K,時間復雜度為N logK。即,借助堆結構,我們可以在log量級的時間內查找和調整/移動。因此,維護一個K(該題目中是 10)大小的小根堆,然后遍歷300 萬的 Query ,分別和根元素進行對

4、比所以,我們最終的時間復雜度是:O(N)+ N*O (logK),(N為1000萬,N為300萬)。ok,更多, 詳情,請參考原文。或者:采用 trie 樹,關鍵字域存該查詢串出現的次數,沒有出現為 0。最后用 10 個元素的最小推來對出現頻率進行排序。3、有一個1G 大小的一個文件,里面每一行是一個詞,詞的大小不超過16 字節,內存限制大小是1M 。返回頻數最高的 100 個詞。方案:順序讀文件中,對于每個詞x,取hash(x)P00,然后按照該值存到5000個小文件(記為x0,x1,x4999)中。這樣每個文件大概是 200k左右。如果其中的有的文件超過了 1M 大小, 還可以按照類似的方

5、法繼續往下分, 直到分解得到的小文件的大小都不超過1M 。對每個小文件,統計每個文件中出現的詞以及相應的頻率(可以采用trie機/hash_map等) ,并取出出現頻率最大的 100 個詞(可以用含100 個結點的最小堆) ,并把 100 個詞及相應的頻率存入文件,這樣又得到了 5000 個文件。下一步就是把這5000 個文件進行歸并(類似與歸并排序)的過程了。4、有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的 query 都可能重復。要求你按照 query 的頻度排序。還是典型的TOP K算法,解決方案如下:方案 1 :順序讀取10個文件,按照hash(q

6、uery)的結果將query寫入到另外10個文件(記為)中。這樣新生成的文件每個的大小大約也1G (假設hash函數是隨機的)。找一臺內存在 2G左右的機器,依次又用hash_map(query, query_count)來統計每個query 出現的次數。利用快速/堆 /歸并排序按照出現次數進行排序。將排序好的 query 和對應的query_cout 輸出到文件中。這樣得到了 10 個排好序的文件(記為) 。對這 10 個文件進行歸并排序(內排序與外排序相結合) 。方案 2 :一般 query 的總量是有限的,只是重復的次數比較多而已,可能對于所有的 query ,一 次性就可以加入到內存了

7、。這樣,我們就可以采用trie機/hash_map等直接來統計每個 query出現的次數,然后按出現次數做快速/堆/ 歸并排序就可以了。方案 3 :與方案 1 類似,但在做完 hash ,分成多個文件后,可以交給多個文件來處理,采用分布式的架構來處理(比如 MapReduce ) ,最后再進行合并。5 、給定a、 b 兩個文件,各存放50 億個 url ,每個 url 各占 64 字節,內存限制是4G,讓你找出 a、 b 文件共同的 url?方案1:可以估計每個文件安的大小為5GX64=320G,遠遠大于內存限制的4G。所以不可能將其完全加載到內存中處理??紤]采取分而治之的方法。遍歷文件a,對

8、每個url求取hash(url)00 ,然后根據所取得的值將url分別存儲到1000個小文件(記為 a0,a1,a999)中。這樣每個小文件的大約為300M。遍歷文件b,采取和a相同的方式將url分別存儲到1000小文件(記為b0,b1,b999)。 這樣處理后,所有可能相同的 url都在對應的小文件(a0vsb0,a1vsb1,a999vsb999)中,不 對應的小文件不可能有相同的url。然后我們只要求出 1000對小文件中相同的 url即可。求每對小文件中相同的 url 時,可以把其中一個小文件的 url 存儲到 hash_set 中。然后遍歷另一個小文件的每個url ,看其是否在剛才構

9、建的 hash_set 中,如果是,那么就是共同的 url ,存到文件里面就可以了。方案 2 :如果允許有一定的錯誤率,可以使用 Bloom filter , 4G 內存大概可以表示340億 bit 。將其中一個文件中的 url 使用 Bloom filter 映射為這 340 億 bit ,然后挨個讀取另外一 個文件的url,檢查是否與 Bloom filter ,如果是,那么該 url應該是共同的url (注意會有一 定的錯誤率) 。Bloom filter 日后會在本BLOG 內詳細闡述。6、在2.5億個整數中找出不重復的整數,注,內存不足以容納這 2.5 億個整數。方案 1 :采用2-

10、Bitmap (每個數分配2bit , 00 表示不存在, 01 表示出現一次, 10 表示多次,11無意義)進行,共需內存2A32 * 2 bit=1 GB內存,還可以接受。然后掃描這 2.5億個整數,查看Bitmap 中相對應位,如果是00 變 01 , 01 變 10, 10 保持不變。所描完事后,查看 bitmap ,把對應位是01 的整數輸出即可。方案 2 :也可采用與第1 題類似的方法,進行劃分小文件的方法。然后在小文件中找出不重復的整數,并排序。然后再進行歸并,注意去除重復的元素。7、騰訊面試題:給40 億個不重復的 unsigned int 的整數,沒排過序的,然后再給一個數,

11、如何快速判斷這個數是否在那40 億個數當中?與上第 6 題類似,我的第一反應時快速排序+二分查找。以下是其它更好的方法:方案 1 : oo , 申請 512M 的內存, 一個 bit 位代表一個unsigned int 值。 讀入 40 億個數,設置相應的 bit 位,讀入要查詢的數,查看相應bit 位是否為 1 ,為 1 表示存在,為 0 表示不存在。方案 2 :這個問題在編程珠璣里有很好的描述,大家可以參考下面的思路,探討一下:又因為2A32為40億多,所以給定一個數可能在,也可能不在其中;這里我們把40億個數中的每一個用 32 位的二進制來表示假設這 40 億個數開始放在一個文件中。然后

12、將這 40 億個數分成兩類:1.最高位為 0 2.最高位為 1 并將這兩類分別寫入到兩個文件中, 其中一個文件中數的個數 =20 億(這相當于折半了) ;與要查找的數的最高位比較并接著進入相應的文件再查找再然后把這個文件為又分成兩類 : 1.次最高位為 0 2.次最高位為 1 并將這兩類分別寫入到兩個文件中,其中一個文件中數的個數 =10億(這相當于折半了) ;與要查找的數的次最高位比較并接著進入相應的文件再查找。.以此類推,就可以找到了,而且時間復雜度為O(logn) ,方案 2 完。附:這里,再簡單介紹下,位圖方法:使用位圖法判斷整形數組是否存在重復判斷集合中存在重復是常見編程任務之一,

13、當集合中數據量比較大時我們通常希望少進行幾次掃描,這時雙重循環法就不可取了。位圖法比較適合于這種情況,它的做法是按照集合中最大元素 max 創建一個長度為max+1 的新數組,然后再次掃描原數組,遇到幾就給新數組的第幾位置上 1 ,如遇到 5 就給新數組的第六個元素置1 , 這樣下次再遇到 5 想置位時發現新數組的第六個元素已經是1 了,這說明這次的數據肯定和以前的數據存在著重復。 這種給新數組初始化時置零其后置一的做法類似于位圖的處理方法故稱位圖法。它的運算次數最壞的情況為2N。如果已知數組的最大值即能事先給新數組定長的話效率還能提高一倍。歡迎,有更好的思路,或方法,共同交流。8、怎么在海量

14、數據中找出重復次數最多的一個?方案1:先做hash,然后求模映射為小文件,求出每個小文件中重復次數最多的一個,并記錄重復次數。 然后找出上一步求出的數據中重復次數最多的一個就是所求 (具體參考前面的題) 。9、上千萬或上億數據(有重復),統計其中出現次數最多的前N 個數據。方案 1 : 上千萬或上億的數據, 現在的機器的內存應該能存下。 所以考慮采用 hash_map/搜索二叉樹/ 紅黑樹等來進行統計次數。然后就是取出前N 個出現次數最多的數據了,可以 用第 2 題提到的堆機制完成。10、一個文本文件,大約有一萬行,每行一個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間復雜度分析。方案 1 :這題是考慮時間效率。用 trie 樹統計每個詞出現的次數,時間復雜度是O(nle)(le 表示單詞的平準長度) 。 然后是找出出現最頻繁的前10 個詞, 可以用堆來實現, 前面的題中已經講到了,時間復雜度是 O(nlg10)。所以總的時間復雜度,是 O(nle)與O(nlg10)中較大的哪一個。 附、 100w 個數中找出最大的 100 個數。方案 2 :在前面的題中,我們已經提到了,用一個含 100 個元素的最小堆完成。復雜度為 O(100w*lg100) 。方案 3

溫馨提示

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

評論

0/150

提交評論