關於“100g文件全是數組,取最大的100個數”解決方法匯總


原題如下:

有一個100G大小的文件里存的全是數字,並且每個數字見用逗號隔開。現在在這一大堆數字中找出100個最大的數出來。

 

我認為,首先要摸清考官的意圖。是想問你os方面的知識,還是算法,或者數據結構。

如果是os: 無疑是外排序算法的選擇。100g文件在當前的環境下是無法全部讀入內存的。

如果是算法:我覺得這個題考慮排序就是錯的,只需要比較。找出最大的即可。

無論是哪種,都不需要一個實際代碼的解決方案。只提供思路就可以了。所以,這道題也可以從面試的角度去回答而不是技術層面回答。

至於在技術層面有沒有必要研究這個問題,那就是個人有個人看法了。

比較機靈的回答:

繼續詢問考官:這100g的文件是不是已經排序好了的?

如果已排序,那還不是信手拈來?

 

比較極端的回答:

請問:
1,你使用的什么操作系統,100G的文件,NTFS的?vista還是win7的?內存有多少大?
2,如果里面的數字小於100個怎么辦?
3,如果里面的第一個數字就是100G-198個字節,那么java是無法處理的,請給我一個可以處理的語言出來。
4,我知道你會說假設,但是,程序員的任務是解決實際問題,一切皆以實際問題出發。任何一個理論都是有實際模型的。
5,不知道是誰命的題,我建議他命題嚴謹點,我不希望有這樣的同事或者上級,更不希望將來貴公司因為這樣的人毀了前途。  

關於比較數據思路新穎的回答:

 

如果全都是正整數的話,可以先比較長度,挑出長度最長的一類,然后再排序挑出前100,如果最長的一類不足100個,就在長度-1的一類里選...........

(引用http://topic.csdn.net/u/20091013/10/d5d371dc-6dec-4034-bf31-432a47ffce96.html 3樓 ZX_ARES

 

個人比較喜歡的回答:

我把這個算法分為兩個階段。這個是基於概率統計的算法。用統計的方法
有時比專家系統還有效,這是從開復老師的書《世界因你不同》里學到的。

第一,先期學習階段:

先讀入文件中前10萬個數(具體多少視情況定),找出其中最大的100個數,
保存在一個數組MaxAry[100]里.(指針鏈表)

第二,正式查找階段:

讀入文件中一個數,並與MaxAry中最小的數(例如是MaxAry[100])比較。
如果這個數比MaxAry[100]小則讀入下一個數繼續比較。
如果比MaxAry[100]大的話,則將其排入MaxAry中適當位置,繼續讀入下個數……


算法解釋:
10萬個數中選出前100個大數,這意味着之后的數小於這100個數的概率是0.999,
也就是說1000個數中只有1個數需要插入MaxAry中。而隨着讀入數的個數增加,需
要插入MaxAry中的概率越小,效率也越來越高。相當於一個自學習的進化算法。
這個算法的理想前提是文件中的數據分布比較均勻,最差的情況是文件中的數據越往后越大。 

(引用http://topic.csdn.net/u/20091013/10/d5d371dc-6dec-4034-bf31-432a47ffce96.html ) 

 除了第一個回答無論是哪種方法,無疑,肯定是要將100g的文件讀一遍的。而且是邊寫邊處理

此外的回答還有多線程和分段排序再匯總比較。

關於多線程,我無法給出理由反駁。本身對多線程的知識就不牢靠所以不評論。

而分段排序再匯總我有疑問:如果分段后提取出來的最大的100個數字,比另一端里被舍棄的小數字還小呢?

基於上,我覺得還是要找好回答點。是100g?還是處理思路?

這個要看個人的思路。

以上回答,僅作提示。

參考:2010支付寶西安最新筆試題..求高手給出算法和思路


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM