分而治之/哈希映射+Hash_map統計+堆/快速/合並排序
1,海量日誌數據,提取某壹天訪問百度次數最多的IP。
1.)分而治之/哈希映射:把大文件變成小文件(模映射)。
2)hash_map統計:當大文件轉化為小文件時,那麽我們可以使用常規的hash_map(ip,value)在O(n)復雜度上做頻率統計。
3)堆/快速排序:獲取每個文件次數最多的ip,然後對這些文件進行匯總,得到最大的IP次數。
首先是這壹天,把訪問百度的日誌裏的IP拿出來,壹個壹個的寫入壹個大文件。註意IP是32位的,最多有2個32 IPS。也可以使用哈希映射法,比如%1000,將整個大文件映射成1000個小文件,然後找出每個小文件中出現頻率最高的IP(可以使用hash_map對那些1000個文件中的所有IP進行頻率統計,然後依次找出每個文件中出現頻率最高的IP)以及對應的頻率。然後在1000個最大的IP中,找出出現頻率最高的IP,這就是妳想要的。
2.查找熱門查詢,統計300萬個查詢字符串中最熱門的10個查詢。
1.哈希映射:對於每個單詞X,取hash(x)%5000,然後存儲在5000個小文件中(記為x0,x1,...x4999)顯示該值。
所以每個文件大概是200k K,如果有壹部分文件大於1M,可以繼續用類似的方法進行劃分,直到分解得到的小文件的大小小於1M。
2.hash_map統計:對於每個小文件,使用trie tree /hash_map統計每個文件中出現的單詞和對應的頻率。
3.堆/歸並排序:取出出現頻率最高的100個詞(可以使用100個節點的最小堆),然後將這100個詞及其對應的出現頻率存儲在文件中,這樣又得到5000個文件。最後就是這5000個文件合並的過程(類似於合並排序)
5.壹共有10個文件,每個文件是1G,每個文件的每壹行都存儲了用戶的查詢,每個文件的查詢可能會重復。您需要按照查詢頻率進行排序。
哈希映射/模->;HashMap統計->;單個文件堆排序-& gt;多文件合並
6.給定A、B兩個文件,每個文件包含50億個URL,每個文件占64個字節,內存限制為4G,讓妳找出A、B文件的URL * * *?
1.分而治之/哈希映射:遍歷文件A,找到每個url,然後根據得到的值將url存儲到1000個小文件中。這樣每個小文件大約是300M m .遍歷文件B,將URL存儲到1000個小文件中,存儲方式和A壹樣(記錄為)。在此處理之後,所有可能的相同URL都在相應的小文件(
O(N)+N' * O(logK),(N為10000,以N '為hashmap鍵的元素為10000,K=10)。
最小堆包含100個元素。復雜度為O(100w*lg100)。
找出13和2.5億個整數中不重復的整數個數,內存空間不足以容納這2.5億個整數。
/writer #/notebooks/45731388/notes/70253940/preview
這個問題,按順序看這5億個數字。對於讀取的數num,如果對應的二進制中最高位是1,則將此數寫入f1,否則寫入f0。通過這壹步,5億個數字可以分成兩部分,f1中的數字都大於f0中的數字。
除法之後,非常容易知道中位數是在f0還是f1。假設f0中有1億個數,那麽中位數壹定在f1中,而且是f1中從小到大排列的1億個數和其後的數的平均值。
對於f1,可以用下壹個最高的二進制繼續將文件壹分為二,以此類推,直到可以將分好的文件裝入內存,然後將數據裝入內存後直接排序,或者使用快速排序或堆排序(小頂堆)找出第k個最大的數,從而找出中位數。
/s/rdz 4 pft cex 1 ahom 4 kai 3 OQ
/s/vxgtj 9 miw fc 1 yd 3v 44 kvnw