【发布时间】:2022-12-25 00:30:21
【问题描述】:
我有一个包含 N 个元素的列表,想找到地点最小(或最大)的 M 值。 是否有执行此操作的内置函数(沿着 std::sort 或 std::partial_sort 的行)?
【问题讨论】:
-
如果
N(非常)大,N值中的std::make_heap个M个元素,其中堆中的值是值和位置对。 -
创建索引的并行数组(即 0、1、2、...),然后(部分)对索引数组进行排序(基于索引引用的原始数组中的值)。
-
@john:在这种情况下不需要排序/部分排序。
std::nth_element就足够了——通常是线性的而不是 O(n log n)。 -
您将像@john 建议的那样创建并行数组,然后使用
std::nth_element找到位于m的项目(称之为枢轴)。nth_element还将数组划分为不大于其左侧枢轴的元素和不小于其右侧枢轴的项。您存储在并行数组中的索引将告诉您这些元素的位置。 -
@unknown 因为只有几百个元素,所以将它们全部存储在一个容器中就可以了。另一方面,如果您收到数十万、数百万或源源不断的元素,那么维护一个 M 项堆将是一个解决方案。堆元素将由数字和找到的位置组成。