海量資料常見的面試題(頻次最高 隨機抽樣)

2021-08-16 02:52:01 字數 1019 閱讀 8188

【在海量資料中統計出現次數最多的n個】

分兩種情況,

1 如果資料能夠在記憶體中放下,比如如果海量資料是ip位址,最多有4g個ip位址,每個ip位址佔4個位元組 需要記憶體16g,如果內存在幾十g,則完全可以全部裝入記憶體,

直接讀取大檔案,然後建立乙個hash表,統計次數,最後再用堆統計最大的n個

2  如果不能在記憶體放下,比如海量資料是字串,不同的字串個數無限,記憶體中可能存不下,那麼需要先將海量資料進行分堆,按照hash值進行分堆,分成適宜在記憶體中操作的小檔案,比如記憶體1g,字串有20g,那麼就分成20個以上的小檔案

為什麼要用hash分堆,這樣是為了保證同乙個字串只會出現在同乙個檔案

【隨機抽樣問題】

要求從n個元素中隨機的抽取k個元素,其中n無法確定。

這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量n是無法在抽樣開始時確定的;但又要保持隨機性,於是有了這個問題。所以搜尋**有時候會問這樣的問題。

這裡的核心問題就是「隨機」,怎麼才能是隨機的抽取元素呢?我們設想,買彩票的時候,由於所有彩票的中獎概率都是一樣的,所以我們才是「隨機的」買彩票。那麼要使抽取資料也隨機,必須使每乙個資料被抽樣出來的概率都一樣。

【解決】

解決方案就是蓄水庫抽樣(reservoid sampling)。主要思想就是保持乙個集合(這個集合中的每個數字出現),作為蓄水池,依次遍歷所有資料的時候以一定概率替換這個蓄水池中的數字。

其偽**如下:

[cpp]

view plain

copy

init : a reservoir with the size: k  

fori= k+1 to n  

m=random(1, i);  

if( m < k)  

swap the mth value and ith value  

end for

解釋一下:程式的開始就是把前k個元素都放到水庫中,然後對之後的第i個元素,以k/i的概率替換掉這個水庫中的某乙個元素。

海量資料面試題

海量資料面試題 1 給個超過100g的logfile,log中存著ip位址,設計演算法找到出現次數最多的ip位址?第一題 首先我們的思路就是利用雜湊進行檔案的切分,我們把100g大小的logfile分為1000份,那麼下來差不多沒乙個檔案就是100m左右,然後再利用雜湊函式除留餘數的方法分配到對應的...

海量資料面試題

給乙個超過100g大小的log le,log中存著ip位址,設計演算法找到出現次數最多的ip位址?思路 1 使用雜湊切割 將100g大小的檔案分成1000分小檔案 2 使用 hashstr ip 1000 將每個檔案上的ip位址對映到雜湊表中 然後將ip位址轉化成整數形式 3 使用key value...

海量資料面試題

方案1 可以估計每個檔案安的大小為50g 64 320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。s 遍歷檔案a,對每個url求取clip image002,然後根據所取得的值將url分別儲存到1000個小檔案 記為clip image004 中。這樣...