【发布时间】:2010-12-08 20:21:38
【问题描述】:
我正在尝试从我的程序生成的分数列表中获得最高的分数,即 100 分。不幸的是,列表很大(大约数百万到数十亿),因此排序是程序中耗时的部分。
进行排序以获得前 100 名的最佳方法是什么?
到目前为止,我能想到的唯一两种方法是,首先将所有分数生成一个庞大的数组,然后对其进行排序并获取前 100 名。或者第二种,生成 X 个分数,对其进行排序并截断前 100 名score 然后继续生成更多分数,将它们添加到截断列表中,然后再次对其进行排序。
无论我怎么做,它仍然需要比我想要的更多的时间,关于如何以更有效的方式做到这一点的任何想法? (我以前从未上过编程课程,也许你们这些有计算机科学学位的人知道有效的算法可以做到这一点,至少这是我所希望的)。
最后,c++中标准sort()函数使用的排序算法是什么?
谢谢,
-伪造
编辑:仅供任何好奇的人使用...
我在之前和之后做了一些时间试验,结果如下:
旧程序(每次外循环迭代后执行排序):
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 到货...
我还有很多其他更激进的优化需要解决(主要是在减少我运行的迭代次数方面),但就目前而言,速度已经足够好,我可能不会甚至费心去解决那些算法优化。
感谢大家的意见!
【问题讨论】:
-
只是好奇,您生产的数字范围是多少?似乎从十亿个数字列表中取出前 100 个将在顶部有很多重复值,除非您的分数本身是非常大的数字。
-
我不知道有一个标准的 sort()。你在用什么图书馆?这可能是一种快速排序。
-
我的数字范围是可变的,我有一些加权分数可以调整以改变范围。目前,它在 3000 到大约 40000 之间。数字类型是 Int,所以我可以使用全部范围。我使用的标准库是
. -
所以你有一组可能的 37,000 个分数。如果你有 10 亿个分数,假设任何类型的正态分布,你的整个前 100 名将是相同的分数。 37,000 适合 10 亿次超过 27,000 次
-
是的,但问题是分数不是均匀分布的,而是正态分布的(钟形曲线)。我正在寻找最高分,因此重复的并不多。
标签: c++ optimization visual-c++ sorting