周五发下来第三季的练习题,本来早开始做了,结果周五不想加班,回来了,又一些事耽搁了,结果晚上回来才开始弄,从11点弄到这会儿,终于弄完了,快1点了。。汗。。

这次的题目乍一看是个外部排序,题目说有一个文本文件里存放了50000000个138号段的无重复手机号码,要写个java程序把这些手机号从大到小排序,限制是Java程序使用的最大堆内存为64M,这次似乎没归定时间,难不成时间会特别长?50000000个手机号,读取一下估计也要好长时间,加上当时又是周五,归心似箭啊。。怎么不周一发呢。。于是就先放下了。

结果今天吃完饭回家路上,想起还有这难题没有做,心急如焚,怎么做好呢,我对外部排序一点都不擅长,一堆文件并来并去,也是蛮恐怖的唉。忽然想起师傅说的方法,把电话号按前面几位拆分开来,分成n个文件,排好序,然后再全部组装起来;因为前缀本身也有序嘛,按顺序组装好的文件就整体有序。当时我们都不以为然,说这么拆会好长时间,不应该拆,应该用随机读取,外部排序嘛,感觉应该要遵守前人的理论,这样才能体现出有学问。。回到家,打开在公司的测试代码,发现60M内存用我的快速排序,最多可以一一次排91万多电话号,电话号会是138开头的,取前5位,后6位显然可以组成超过91万条电话号,于是有点担心,算了,先分一下试,据师傅透露,分了10几分钟,才分出来几十兆。。汗。回来我试一下,居然一瞬间结束了,也没报错。。一看代码发现,当时测试时加了个只读取900000条数据的限制,于是去掉限制,一运行,发现110多秒就结束了,看看分开的文件,哈哈,十分准确,从13800到13899,100个文件,每个都差不多59M、60M的样子。找到其中最大的文件,是13827,6365K,打开,发现只有501308行,太好了,那就这样吧~~于是程序改了改,套上排序,套上输出,就完了。。觉得在console里输出一些时间、状态会比较慢,而且内容很多,于是弄了个test.txt文件来输出,程序执行完打开test.txt,发现程序执行一下要300秒左右,290s~310s之间的样子。最另人开心的是输出文件和原文件大小一模一样,真开心^_^,赶快调整一下交了,,唉,好困啊。。

按这个方法看来,这题似乎不是外部排序了,不知道是不还有更好的方法。话说,我能用5分钟,没准别人能5秒搞定,牛人太多了哦。算了,还是睡觉吧~~有空再膜拜去。。