1
3
简单地保持第一、第二和第三。
我不会尝试扩展到k=4。我认为三是硬编码的极限。当k变大时,您需要转向正式方法。 这并没有回答您实际提出的问题,即如何进行部分排序,但这似乎是您想要的。 如果您希望部分排序,可以使用快速排序,并在枢轴超出您感兴趣的边界时提前返回。所以我们的第一个支点分为五,二。忽略最后两个,只对最后五个进行子排序。但尽管它比快速排序快,但它不会改变游戏规则。如果你能得到第k项的保守上界(例如,它总是在最小值和平均值之间最多25%),你可以快速消除大部分数据。如果你弄错了,那就再过一两次。 使用快速排序方法
(未经测试,稍微复杂的排序逻辑中可能存在错误)。 然而,我们天真地使用了第一个元素作为枢轴。如果我们对一个大数据集进行排序,它有一个正态分布,我们想要最高的1%,z分数是2.326。再多考虑一点,允许我们有一些抽样误差,然后我们以高于平均值的2.3个标准差的枢轴集进行第一次通过。然后我们将分布分成两组,前1%加上一点,其余的。我们不需要进一步处理其余的,只需对前一组进行排序。 |
2
2
对于您的具体问题,最快的方法是执行类似于下面的操作,因为您只需要三个元素:(使用优先级队列或不同的数据结构可能会更快,但速度不会很明显)
然而,如果k变得比任何一个实现都大得多,则可能更快 Quickselect 或者使用partial_sort方法,我相信它实现了quickselect。然而,给定情况下的quickselect算法的平均常数约为3.4-4.4,略大于上述(3)的常数。还请注意,quickselect的平均运行时间为O(n)。使用中值3可以保证运行时间,但不建议这样做,因为它会显著增加平均常数。Intro select正确处理这一问题,以防止quickselect出现最坏情况,同时保持其平均情况。 |
3
0
我建议使用基数排序,它是这种情况下最有效的排序方法,复杂度为O(n)。你甚至可以稍微改变一下,当找到三个最大值时停止。 您可以找到并理解基数缩写: https://www.cs.usfca.edu/~galles/visualization/RadixSort.html |
4
0
如果我们要找出三个最大的数字,那么我们可以运行
注: 我使用的事实是,你们必须找到前三个最大双打
|
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |