1. 程式人生 > >海量資料的解決思路

海量資料的解決思路

1)給定100億個整數,設計演算法找到只出現一次的整數
解題思路:
使用hash將所有整數對映到1000個檔案中,在每個檔案中使用點陣圖,用兩個bit表示出現次數,00表示沒出現過,01表示出現過1次,10表示出現過多次,11捨棄,最後歸併每個檔案中出現只有1次的數即為所求。
2)給兩個檔案,分別有100億個整數,我們只有1G記憶體,如何找到兩個檔案交集
解題思路:
(1G=2^30B=1073741824位元組=1 000 000 000=10億
1M=2^20B=1048578位元組
=105萬字節)
100億的整數=4*100億個位元組
400億B放在1000個檔案,每個檔案4000萬字節;
4000萬的位元組放在1G的空間完全夠。
步驟:
(1)把第一個檔案的這100億的數用hash對映到1000個檔案裡,每個檔案就是400M,記憶體可以放下,分別編號a0,a1,a2…..;同樣另一個檔案也是分到1000個檔案,編號b0,b1……..,然後依次用點陣圖統計,不計個數,有的話該位元位位為1,(不管出現的次數)
(2)因為相同的hash函式,所有相同的都落到相應的檔案,然後分別用a1,b1的兩個點陣圖相&,那個位元位為1,就是交集,a2b2,a3b3……..同一方法。

3)1個檔案有100億個int,1G記憶體,設計演算法找到出現次數不超過2次的所有整數
解題思路:
(1)先用hash分到多個檔案。相同的會落地一個檔案。
(2)然後用點陣圖的變形,用兩個位元位表示一個數,如果該點陣圖的數的兩個位元位為00表出現0次,01表出現一次,10表出現兩次,11,表是出現次數兩個以上了。
只要不是 11 和 00 數就是出現不超過兩次的數。