海量資料以及大資料常考的筆試面試題

2021-07-31 09:29:49 字數 3529 閱讀 8645

方案一:40 000 000 00 * 4 = 16 000 000 000 = 16g,把這麼多數全部載入到記憶體中是不可能,我們可以考慮用bitmap,每一位表示相對應的數字,1表示存在,0表示不存在,只要512mb記憶體,從檔案中讀取40億數字,設定相對應的位元位,判斷要查詢的那個數相對應的位元位是否為1,若為1表示存在否則表示不存在。

方案二:這裡我們把40億個數中的每乙個數用32位的二進位制來表示。假設這40億個數開始放在乙個檔案中,然後將這40億個數分成兩類:

1.最高位為0    

2.最高位為1

並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=20億,而另乙個》=20億(這相當於折半了);與要查詢的數的最高位比較並接著進入相應的檔案再查詢。再然後把這個檔案為又分成兩類:

1.次最高位為0

2.次最高位為1

並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=10億,而另乙個》=10億(相當於折半);與要查詢的數的次最高位比較並接著進入相應的檔案再查詢。

......

以此類推,就可以找到了,而且時間複雜度為o(logn),方案2完成。

【題目2】(july整理) 在2.5億個整數中找出不重複的整數,注,記憶體不足以容納這2.5億個整數。

方案一:我們同樣可以用bitmap來解決這個問題,但是現在每個數可能有三種狀態,不存在,只有乙個,重複存在,

所以我們想到用2個位元位來表示,00表示這個數不存在,01表示這個數存在一次,10表示這個數存在多次,需要記憶體:250 000 000 * 4 = 1000 000 000 = 10g/16  < 1g 從檔案中讀取這2.5億個整數,如果是第一次存在則從00變成01,如果是多次存在,依舊是10,不變,最終掃瞄位圖,輸出位元位為01的整數就行。

先提取到這一天的ip,將這一天的所有ip寫到檔案中,我們用哈希求模將這個檔案中的ip劃分到1024個小檔案中,每乙個小檔案構建乙個hashmap,key值為ip,value值為ip出現的次數,同時記錄下出現次數最多的ip和次數,在這1024個記錄次數的變數中找到最大的那個對應的ip就可以。

【題目4】怎麼在海量資料中找出重複次數最多的乙個?

先利用哈希求模將這海量資料劃分到1024個小檔案中,每乙個小檔案構建乙個hashmap,key值為資料,value值為次數,同時記錄下每乙個小檔案中出現次數最多的資料和次數,最後在這1024個記錄中找出次數最多的那個變數。

【題目5】 給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?

可以估計每個檔案安的大小為5g×64=320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。

遍歷檔案a,對每個url求取hash(url)%1000,然後根據所取得的值將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,看其是否在剛才構建的hash_set中,如果是,那麼就是共同的url,存到檔案裡面就可以了。

【題目6】有10個檔案,每個檔案1g,每個檔案的每一行存放的都是使用者的query,每個檔案的query都可能重複。要求你按照query的頻度排序。

順序讀取10個檔案,按照hash(query)%10的結果將query寫入到另外10個檔案(記為)中。這樣新生成的檔案每個的大小大約也1g(假設hash函式是隨機的)。

找一台內存在2g左右的機器,依次對用hash_map(query, query_count)來統計每個query出現的次數。利用快速/堆/歸併排序按照出現次數進行排序。將排序好的query和對應的query_cout輸出到檔案中。這樣得到了10個排好序的檔案(記為)。

對這10個檔案進行歸併排序(內排序與外排序相結合)。

【題目7】100w個數中找出最大的100個數。

思路1:遍歷資料,當最小堆的size小於100直接插入,當大於的時候,比較元素和堆頂元素,如果該元素比堆頂元素大,刪除堆頂元素,插入這個元 素,當遍歷完資料的時候,堆中的元素就是要找的100個數

思路2:快速排序,paration返回乙個基準,如果這個基準值不等於100就繼續paration,直到基準值為100,說明前100個數都比這個基準數大,也就是要求得100個數了。

【題目8】有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。

方案:順序讀檔案中,對於每個詞x,取hash(x)%5000,然後按照該值存到5000個小檔案(記為x0,x1,...x4999)中。這樣每個檔案大概是200k左右。

如果其中的有的檔案超過了1m大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1m。

對每個小檔案,統計每個檔案中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100個詞及相應的頻率存入檔案,這樣又得到了5000個檔案。下一步就是把這5000個檔案進行歸併(類似與歸併排序)的過程了。最終取出頻數最高的100個詞

【題目9】尋找熱門查詢:搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組 假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門),請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。   

雖然有一千萬個query,但是由於重複度比較高,因此事實上只有300萬的query,每個query255byte,因此我們可以考慮把他們都放進記憶體中去,而現在只是需要乙個合適的資料結構,在這裡,hash table絕對是我們優先的選擇。所以我們放棄分而治之/hash對映的步驟,直接上hash統計,然後排序。so,

hash統計:先對這批海量資料預處理(維護乙個key為query字串,value為該query出現次數的hashtable,即hash_map(query,value),每次讀取乙個query,如果該字串不在table中,那麼加入該字串,並且將value值設為1;如果該字串在table中,那麼將該字串的計數加一即可。最終我們在o(n)的時間複雜度內用hash表完成了統計;

堆排序:第二步、借助堆這個資料結構,找出top k,時間複雜度為n『logk。即借助堆結構,我們可以在log量級的時間內查詢和調整/移動。因此,維護乙個k(該題目中是10)大小的小根堆,然後遍歷300萬的query,分別和根元素進行對比所以,我們最終的時間複雜度是:o(n) + n'*o(logk),(n為1000萬,n』為300萬)。

大資料以及hadoop的入門介紹

為什麼大資料這幾年才發展起來?隨著網際網路技術的深入發展,產生了越來越多的資料。比如 1 電商 產生了大量的使用者瀏覽,購物行為 2 移動運營商記錄了大量的使用者上網行為 3 金融系統的分析 以上的這些需求,用以前傳統的技術無法勝任,需要有乙個全新的技術體系來支撐。在此背景下就產生了一系列針對海量資...

大資料以及大資料技術都包括哪些內容

大資料技術主要圍繞 資料價值化 這個核心來展開,涉及到資料採集 資料整理 資料儲存 資料安全 資料分析 資料呈現和資料應用等技術。資料採集技術涉及到物聯網技術,實際上物聯網也是大資料主要的資料 所以大資料與物聯網的關係也非常密切,也可以說沒有物聯網的發展就不會有大資料。如果你想要學好大資料最好加入乙...

資料基礎 資料以及資料集的操作

資料和資料集 元素 物件 容器資料元素 算數運算 代數運算 邏輯運算 位移運算增 刪 改 查 初始化 遍歷 排序 iterator 資料型別轉換 包含 常見keys 刪除 remove del pop clear delete drop truncate 改 set 查 take get endsw...