1.從a,b兩個文件各存放50億個url(每個url大小為64B),如何在內存為4G中查找a,b中相同的url
計算各文件存放大小:50億*64B 大約為320G,而內存只有4G,顯然存放不下,此時我們可以通過分治思想來解決該問題
通過hash存放,先將a中各url通過hash(url)%1000,可以得到0-999之間某個數,此時將其存放到對應序號文件中,大約每個文件大小為300MB,再將b文件各url同理操作,我們可以明顯得知,a和b中相同的url一定是在一個序號文件中,這樣就可以通過將a,b相同序號文件放入內存中查找,利于HashSet來比對,找到相同的就取出存放在一個相同文件中,不斷比對就得出結果
2.給你一個大小為1G的文件,里面存放的都是大小為16B的單詞,現在我們可用的內存為1MB,請問我想要找到出現次數最多的前100個單詞,如何解決?
該題和上面那題思路大體一樣,還是分治思想:
我們通過hash(word)% 2000,即拆分為每個文件大小為500KB的小文件,然后再各小文件中利用map計算出現頻次最高的前100個單詞,接下來就是遍歷所有小文件,查找前100個出現次數最多的單詞,即Top-K問題:建立小堆,遍歷查找
Tok-K思想如下博客:
Top-K問題-CSDN博客
3.如何在2億個數中查找出現次數為1的數,內存不足以一次讀取該文件全部內容
1.分治思想:
和前面類似,我們還是利用hash映射拆分為一定量個小文件,然后將小文件利用hashmap進行統計,最終在內存中找到只出現一次的詞
2.位圖思想:
我們知道一個字節8bit,那么我們可以利用bit位記錄某個數是否出現,例如00000000,這8位我們可以記錄1-8出現與否,現在我們要查找出現次數為1的整數,那么一個數利用兩位記錄,例如:00-未出現 01出現次數為1,10出現次數>1,這樣我們就可以找到出現次數為1的數了
4.現在我有1000瓶藥劑,其中只有一瓶毒藥,其余999瓶都是無害的,現在我給你10只老鼠,請問如何試藥才能確定哪瓶是毒藥?
現在我們將這一千瓶表上序號即1---1000,接下來我們將其轉換為二進制形式,1000---》1111101000,那么第一位老鼠喝2^0次方上為1的藥,第二位老鼠喝2^1的藥,類推到第10位老鼠喝2^9次方的藥,觀察老鼠死亡情況,例如:只有第一老鼠喝第五位老鼠死亡,那么17號瓶子是毒藥,這樣就可以確定毒藥情況了(思維題)
總結:
面對海量數據處理時:
我們可以先考慮是否能夠通過分治思想來解決,然后再思考HashMap和HashSet,也可以利用位圖思想,最后在思考是不是可以利用堆來解決(Top-K問題)
希望大家都能夠處理這方面問題,加油!!!