C++ 查找列表中k个最低值的搜索算法

C++ 查找列表中k个最低值的搜索算法,c++,c,algorithm,search,selection,C++,C,Algorithm,Search,Selection,我有一个包含n个双精度值的列表,我需要在该列表中找到k个最低的双精度值 k比n小得多 具有n个双精度值的初始列表是随机排序的 找到的k个最低双精度值不需要排序 您推荐什么算法? 目前,我使用快速排序对整个列表进行排序,然后从排序后的列表中取出前k个元素。我认为应该有一个更快的算法 谢谢你的帮助您可以使用查找第k个最低的元素,然后迭代并返回该元素以及低于该元素的所有元素。如果列表中可能包含重复项,则需要做更多的工作(确保最后不会有更多需要的元素)。 此解决方案是O(n)。 选择算法在C++中作

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

  • k比n小得多
  • 具有n个双精度值的初始列表是随机排序的
  • 找到的k个最低双精度值不需要排序
您推荐什么算法?

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

谢谢你的帮助

您可以使用查找第k个最低的元素,然后迭代并返回该元素以及低于该元素的所有元素。如果列表中可能包含重复项,则需要做更多的工作(确保最后不会有更多需要的元素)。
此解决方案是
O(n)
。 选择算法在C++中作为

实现 另一种选择是使用大小为
k
的max
,并迭代元素,同时保持堆保存所有k个最小元素

for each element x:
   if (heap.size() < k):
      heap.add(x)
   else if x < heap.max():
      heap.pop()
      heap.add(x)
对于每个元素x:
如果(heap.size()
完成后,堆包含k个最小元素。
这个解决方案是O(NLogk)

< P>从C++标准库中查看算法。

可以使用。这是O(N)复杂度,因为它不会对元素进行排序,它只是对元素进行排列,使某个N下的每个元素都小于N。

您可以对解决方案进行建模,以匹配这些元素

  • Heapify maxheap上的第一个k值
  • 迭代剩余的n-k值
  • 将每个元素与堆顶部的元素进行比较
  • 如果新值较低,则执行heappreplace操作(用新值替换最上面的heap元素,然后向下筛选)
该算法的效率令人惊讶。例如,当n=100000和k=100时,对于随机排列的输入,比较次数通常在106000左右。这仅仅比100000次比较多一点就可以找到一个最小值。而且,它在整个数据集上进行的比较比完整的快速排序少20倍


各种算法的相对强度研究和总结如下:

您可以使用选择排序,选择第一个最低值需要O(n)。一旦我们在位置1上设置了这个最低值,我们就可以重新扫描数据集,找出第二个最低值。直到我们得到第k个最小值。这样,如果k比n小得多,那么我们的复杂度kn等于O(n).

该算法与快速排序非常相似。你可以稍微修改一下,得到所有k个最小值的无序列表。我不明白,通过每次进行k个比较来迭代存储k个最大值的列表不是更快吗。为什么需要先对其进行排序。搜索比排序快。我认为
n\u元素
为这个问题提供了更有效的解决方案。O(n log k)是最坏的情况。事实上,该算法通常只比O(n)慢一点。请参阅我的答案以了解更多详细信息,以及运行时间的研究和总结位置的链接。非常好的答案我想知道为什么OP建议首先进行排序,而您只需要迭代元素并在每个步骤进行比较。