這些問題通常有着內存限制,使用hashmap和位圖解決不實際。數組
1.只用2GB內存在20億個整數中找到出現次數最多的數?
將20億個整數的大文件用hash函數分爲16小文件(這個時候同一個數通常分到了同一個小文件上,小文件的數最好不要超過2億),這個時候每一個小文件用hash函數計算出現次數,這個時候獲得16個數爲各自文件下出現最多,再比較獲得這16個數出現最多的那個,就是咱們想要的。函數
2.40億個非負整數中找到沒出現的數?
32位無符號整數的範圍是0-4294967295,存在於一個文件上,最多使用一個G的內存(全部不出現的數),或者說限制爲10m的內存(一個未出現的數)。
比如將他們分了64個區間,一個區間應該有67108864,將這個些數遍歷,先申請一個長度64的整數數組,統計在區間i 上的個數,遍歷完以後,再遍歷區間數組,少於67108864的拿出來找缺失的j,接着作67108864的位圖數組,再遍歷一遍0-4294967295,不在區間j的忽略,沒有置1的天然就是缺失了,這時要找的是67108864*i+j。排序
3.找到100億個URL中重複的URL以及搜索詞彙的topK問題?
這個都是創建在數據量很大的狀況下,通常作法劃分小文件或多個機器上,就是經過哈希函數來劃分,能保證相同的數據放到相同的機器或文件上,而後在小文件或機器上使用哈希函數統計,小根堆排序top100,而後把不一樣機器的top100進行外排序或繼續使用小根堆。內存
4.40億個非負整數中找到出現次數兩次的數和全部數的中位數?
若是有1G的內存,就開個大位圖數組長度爲80億,第一遇到num就見bitArr[num*2+1]和bitArr[num*2]設置01,下一次10,第三次或屢次都是11,這個遍歷bitArr時10的就是要找的,若是在內存上有限制的話,就要分區間處理。找中位數也若是,分區間處理,經過累加每一個區間的出現的次數,找到中位數落在那個區間,再對這個區間作詞頻統計。hash