【发布时间】:2013-01-31 21:51:15
【问题描述】:
我需要找到 C++ 中未排序、长度为 n、数组/向量的 k 个最大元素的索引,其中 k
在没有 nth_element() 的情况下实现它似乎我必须遍历整个数组一次,在每一步填充最大元素的索引列表。
标准 C++ 库中是否有任何东西可以使它成为单行或任何巧妙的方式来自己用几行代码实现它?在我的特殊情况下,k = 3 和 n = 6,因此效率不是一个大问题,但如果找到一种干净有效的方法来对任意 k 和 n 执行此操作,那就太好了。
看起来Mark the top N elements of an unsorted array 可能是我能在 SO 上找到的最接近的帖子,其中的帖子是 Python 和 PHP。
【问题讨论】:
-
可以修改矢量吗? nth_element 将在原地进行部分排序,因此它会修改向量。
-
向量可以修改,但最终结果需要是k个最大元素的索引(原始向量的)。
-
这只是一个选择算法。通常你会使用堆选择或快速选择。有关类似问题,请参阅 stackoverflow.com/q/7746648/56778。有一个好的 C++ 解决方案的答案。 (使用priority_queue)
-
顺便说一下,如果 k=3 和 n=6,那么您最好只对数组进行排序并选择前 3 个项目。正如你所说,效率不是一个大问题,O(kn) 和 O(n) 之间的差异对于这么小的数字来说是微不足道的。