原題如下:
有一個100G大小的文件里存的全是數字,並且每個數字見用逗號隔開。現在在這一大堆數字中找出100個最大的數出來。
我認為,首先要摸清考官的意圖。是想問你os方面的知識,還是算法,或者數據結構。
如果是os: 無疑是外排序算法的選擇。100g文件在當前的環境下是無法全部讀入內存的。
如果是算法:我覺得這個題考慮排序就是錯的,只需要比較。找出最大的即可。
無論是哪種,都不需要一個實際代碼的解決方案。只提供思路就可以了。所以,這道題也可以從面試的角度去回答而不是技術層面回答。
至於在技術層面有沒有必要研究這個問題,那就是個人有個人看法了。
比較機靈的回答:
繼續詢問考官:這100g的文件是不是已經排序好了的?
如果已排序,那還不是信手拈來?
比較極端的回答:
請問:
1,你使用的什么操作系統,100G的文件,NTFS的?vista還是win7的?內存有多少大?
2,如果里面的數字小於100個怎么辦?
3,如果里面的第一個數字就是100G-198個字節,那么java是無法處理的,請給我一個可以處理的語言出來。
4,我知道你會說假設,但是,程序員的任務是解決實際問題,一切皆以實際問題出發。任何一個理論都是有實際模型的。
5,不知道是誰命的題,我建議他命題嚴謹點,我不希望有這樣的同事或者上級,更不希望將來貴公司因為這樣的人毀了前途。
關於比較數據思路新穎的回答:
(引用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?還是處理思路?
這個要看個人的思路。
以上回答,僅作提示。