1.從 40 個億中產生一個不存在的整數
可以采用位圖存儲數據,申請一個 bit 類型的數組 bitArr ,每個位置只表示 0 或者 1 狀態,可以將占用內存縮小為使用哈希表的 1/32 。
遍歷給定的 40 億個數,遇到數時就將 bitArr 相應位置設置為 1 。
遍歷結束后,再遍歷 bitArr ,哪個位置上的值是 0 ,那這個數就不在 40 億個數中。
假如現在只有 10 MB 內存空間可用,就可以考慮使用分塊的方法。通過時間換取空間。
將數據平均分成多個區間,只計算區間內的數據,總有一個區間的數是少于其他區間的平均計數的,那就可以從這個區間里用位圖的方式找到沒出現過的數。
2.用 2GB 內存在 20 億個整數中找到出現次數最多的數
極端情況下這些數可以全部都不相同,那么內存占用會非常大。
使用哈希函數將大文件分為小文件,同一種數是不會被分到不同的小文件上的,就可以得到每個小文件中出現最多的數以及次數統計。
3.從 100 億個 URL 中查找重復項
同樣使用哈希函數將文件拆分,拆分要注意資源限制,要明確將數據分到若干臺機器或者分為若干個文件。
4. 40 億個非負整數中找到出現兩次的數
與第一位相同,使用位圖,但是這次要用兩倍大小的位圖解決問題。
用兩位表示一個數據,初始為 00 ,每次出現都加一,且加到 11 之后不再變動,這樣最后兩位為 10 的位置表示的就是出現了兩次的數。
如果對您有幫助,請點贊關注支持我,謝謝! ?
如有錯誤或者不足之處,敬請指正! ?
個人主頁:星不易 ?
算法通關村專欄:不易|算法通關村 ?