C++ nth_element 算法的有趣用例是啥?
Posted
技术标签:
【中文标题】C++ nth_element 算法的有趣用例是啥?【英文标题】:What is an interesting use-case for C++ nth_element algorithm?C++ nth_element 算法的有趣用例是什么? 【发布时间】:2019-05-18 19:28:34 【问题描述】:我发现了很多关于如何使用 C++ STL 的nth_element
算法的问题和答案,但到目前为止我还没有找到任何有趣的用例。特别是,在什么实际用例中我会使用 nth_element 而不是仅仅对整个向量进行排序?
编辑:显然,nth_element
可用于查找数据的中位数或其他百分位数,但它似乎效率低下,因为它修改了向量。
【问题讨论】:
您可以更有效地获得例如 25% 的百分位数。 【参考方案1】:一个典型的用例是当一个人想要避免对整个集合进行排序时,因为它很大。如果只需要前 n 个,则使用 nth_element 对集合进行分区。然后第一个分区包含前 n 个元素。
【讨论】:
好的,获得前 n 个是一个合理的用例。我对“nth_element”这个名称感到困惑(恕我直言,“top_n”之类的名称会更清楚)。谢谢 如果你找到一个大数据集的第20个,你可以对分区后的第一页结果进行简单的排序。 如果您想要“大数据集的前 20 个元素,已排序”,可以调用:partial_sort
【参考方案2】:
您想回答“什么是中位数?”的数据集。不需要对其进行排序,您只需要一个大于 50% 小于 50% 的条目。
【讨论】:
我看到威廉和我有同样的想法;我们穿越了。 我想过,但似乎很奇怪——找到中位数是一个查询,而 nth_element 改变了向量。我真的必须修改向量,才能回答有关它的查询吗? (相比之下,如果我想要向量中的最大元素,我不必对其进行排序 - 我可以使用不会更改向量的max_element
)。以上是关于C++ nth_element 算法的有趣用例是啥?的主要内容,如果未能解决你的问题,请参考以下文章
cudaGraphicsGLRegisterImage中cudaGraphicsRegisterFlagsWriteDiscard的用例是啥?