【发布时间】:2023-03-05 22:00:01
【问题描述】:
我有很多(数十万,m)组双打 d,~5-10(n,constant small)长。这些双打基本上是随机分布的。我需要得到每组的中位数:因为 m 非常大,我们需要很快地计算出中位数......虽然这些组非常小,所以我认为这将在选择如何做时发挥重要作用中位数。我知道我可以使用nth_element 通过选择算法获得 O(n) 中的中位数,我知道我不会在复杂性上击败它。但是,由于常数 n 很小,我可能正在寻找开销最小的方法。
我找到了很多不同的方法来做中位数(下),但如果有人知道在这里使用的“正确”方法,我只是好奇。
Min max heaps(O(n) 构建时间,持续访问,可能开销太大)
This question from 2010 可能已经过时了(新的 STL/Boost 代码可能已经实现了这些东西),也更关注时间复杂度而不是开销。
【问题讨论】:
-
他们是
std::sets 还是doubles? -
如今,以任何合理的标准衡量,“数十万”都不是“很多”。如果你有几十万个 5-10 个双精度元组,那么算法就无关紧要了。一个粗略的 Python 脚本遍历行,进行完整排序并打印中间元素应该在几秒钟内完成。
-
您知道
nth_element在您的设置中的执行速度有多快吗?你需要快多少倍? -
nth_element可能会在下面执行基于 QSort 的第 k 个统计算法。任何使用堆等都意味着分配额外的空间,这本身可能已经增加了超出您所能承受的开销。我会说基准nth_element,你不会得到太多。 -
@MadScienceDreams 关于
N(m)是常量n的附加信息(您有lottsa-lists,但它们都是n元素长;这在问题中并不明显,因为-声明)很重要。您可以根据该大小选择可能展开的算法。