从非常大的未排序列表中获取最大 X 数字的最快方法?

2024-04-21

我试图从我的程序生成的分数列表中获取最高的分数(例如 100 分)。不幸的是,该列表很大(大约数百万到数十亿),因此排序是程序中一个耗时的部分。

排序以获得前 100 名分数的最佳方法是什么?

到目前为止我能想到的唯一两种方法是要么首先将所有分数生成一个巨大的数组,然后对其进行排序并取前 100 个分数。或者第二种,生成 X 个分数,对其进行排序并截断前 100 个分数,然后继续生成更多分数,将它们添加到截断的列表中,然后再次排序。

不管怎样,我仍然需要比我想要的更多的时间,关于如何以更有效的方式做到这一点有什么想法吗? (我以前从未上过编程课程,也许那些拥有计算机科学学位的人知道执行此操作的有效算法,至少这是我所希望的)。

最后,C++ 中标准 sort() 函数使用的排序算法是什么?

Thanks,

-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

在 core 2、1.6 GHz 上完成...我已经等不及我的 core i7 860 到货了...

还有很多其他更积极的优化需要我去解决(主要是在减少我运行的迭代次数方面),但就目前而言,速度已经足够好了,我什至可能懒得去计算出那些算法优化。

感谢大家的投入!


  1. 获取前 100 个分数,并将它们排序在一个数组中。
  2. 获取下一个分数,并将其插入排序到数组中(从“小”端开始)
  3. 删除第 101 个值
  4. 继续使用下一个值(2),直到完成

随着时间的推移,列表将越来越类似于前 100 个最大值,因此更常见的是,您会发现插入排序立即中止,发现新值小于前 100 个候选值的最小值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从非常大的未排序列表中获取最大 X 数字的最快方法? 的相关文章

随机推荐