c – 从非常大的未排序列表中获取最大X数的最快方法?
我正在尝试从我的程序生成的分数列表中获得100分.不幸的是,这个列表是巨大的(数百万到数十亿),所以排序是程序的一个时间密集的部分.
做排序的最佳方法是获得前100名成绩? 到目前为止,我可以想到的唯一的两种方法是先将所有分数全部生成一个庞大阵列,然后将其排序并排在前100位.或者第二,生成X个分数,排序并截断前100个分数,然后继续产生更多分数,将它们添加到截断的列表中,然后再次排序. 无论哪种方式,我都会这样做,还需要更多的时间比我想要的任何想法如何以更有效的方式做到这一点? (我从来没有参加过编程课程,也许那些具有comp sci学位的人都知道有效的算法来做到这一点,至少这是我希望的). 最后,在c中使用标准sort()函数的排序算法是什么? 谢谢, -Faken 编辑:只是为任何人好奇… 我在前后做过几次试验,结果如下: 旧程序(每个外循环迭代后的预制排序): top 100 scores: 147 seconds top 10 scores: 147 seconds top 1 scores: 146 seconds Sorting disabled: 55 seconds 新程序(只执行跟踪最高分,并使用默认排序功能): top 100 scores: 350 seconds <-- hmm...worse than before top 10 scores: 103 seconds top 1 scores: 69 seconds Sorting disabled: 51 seconds 新的重写(数据存储优化,手写排序算法): top 100 scores: 71 seconds <-- Very nice! top 10 scores: 52 seconds top 1 scores: 51 seconds Sorting disabled: 50 seconds 完成在一个核心2,1.6 GHz …我不能等到我的核心i7 860到达… 对于我来说,还有很多其他更加积极的优化(主要是在减少我运行的迭代次数的方面),但是像现在这样,速度还不够好,我甚至不会打扰制定出这些算法优化. 感谢eveyrone的输入! 解决方法
获取前100个分数,并将它们排列在数组中.
>取下一个分数,并将其插入到数组中(从“小”结尾开始) >删除第101个值 >继续下一个值,在2,直到完成 随着时间的流逝,这个列表将会越来越像100个最大的值,所以更多的时候你会发现插入排序立即中止,发现新值小于前100名候选人的最小值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |