c++ - 搜索算法以查找列表中的 k 个最小值

标签 c++ c algorithm search selection

我有一个包含 n 个 double 值的列表,我需要在该列表中找到 k 个最低的 double 值

  • k 远小于 n
  • 具有 n 个 double 值的初始列表是随机排序的
  • 找到的 k 个最低的 double 值不需要排序

你会推荐什么算法?

目前我使用Quicksort 对整个列表进行排序,然后从排序后的列表中取出前k 个元素。我希望应该有一个更快的算法。

感谢您的帮助!!!

最佳答案

您可以为您的解决方案建模以匹配 nlargest() code in Python's standard library .

  • 在最大堆上堆放前 k 个值。
  • 迭代剩余的 n - k 个值。
  • 将每个元素与堆顶部的元素进行比较。
  • 如果新值较低,则执行heapreplace操作(用新值替换最顶层的堆元素,然后向下筛选)。

该算法的效率出奇地高。例如,当 n=100,000 且 k=100 时,对于随机排列的输入,比较次数通常约为 106,000 次。这只是略多于 100,000 次比较才能找到一个最小值。而且,它在整个数据集上进行的比较比完全快速排序少大约 20 倍。

研究和总结各种算法的相对强度:http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest

关于c++ - 搜索算法以查找列表中的 k 个最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407114/

相关文章:

python - 在 Python 中按位置有效地对坐标点列表进行分组

java - 如何找到连接假值二维数组边界的真值路径

c++ - 在返回的 XML 上循环映射以获取节点值

c++ - 我想实现一个接收与 std::bind 相同的参数然后调用它的函数,如何实现?

c++ - 简单的正则表达式似乎不工作 C++

c - X11透明窗口: click-through only where alpha = 0

c++ - 如何关闭线程分离 C++?

c - 使用 make & C 计算多文件编译

c++ - OpenGL 中的全光灯?

algorithm - Strassen 计算矩阵平方的方法有什么问题?