福哥答案2020-07-03:
1.雙重遍歷。
時間復雜度是O(N^2)。
2.排序。
采用外部排序。時間復雜度是O(NlogN)。
3.遍歷加哈希存儲。
空間換時間,時間復雜度是O(N),空間復雜度是O(N)。這種方法適用於小數據量,在這里用明顯不合適。
4.布隆過濾器。
根據公式計算,萬分之一的失誤率需要228M內存。個人感覺這種方法不太合適。
5.壓縮位圖。
根據我目前的分析,壓縮位圖適合稀疏存儲,在這里用,效果不明顯。32位整數總共有42億個,這道題有1億個數字,1/42算不算稀疏,就不得而知了。時間有限,沒測試。
6.哈希分組。
這1億個數字整數范圍不限。
一個分組里有兩個參數,一個參數保存數據,另一個參數保存個數DataCount。重復的數字一定在同一個分組中,然后對每一個分組進行遍歷加哈希存儲。如果DataCount過大,再次哈希分組。
7.位圖。
32位整數范圍,占用內存4G/8=512M。
最大值和最小值范圍,占用內存 (max-min)/8+1,最小占用內存 1億/8=不到12M。
結論:方法6和方法7都行。方法6適用的范圍廣,浮點數也行。方法7只適用於32位整數。