C++ 查找列表中k个最低值的搜索算法
我有一个包含n个双精度值的列表,我需要在该列表中找到k个最低的双精度值C++ 查找列表中k个最低值的搜索算法,c++,c,algorithm,search,selection,C++,C,Algorithm,Search,Selection,我有一个包含n个双精度值的列表,我需要在该列表中找到k个最低的双精度值 k比n小得多 具有n个双精度值的初始列表是随机排序的 找到的k个最低双精度值不需要排序 您推荐什么算法? 目前,我使用快速排序对整个列表进行排序,然后从排序后的列表中取出前k个元素。我认为应该有一个更快的算法 谢谢你的帮助您可以使用查找第k个最低的元素,然后迭代并返回该元素以及低于该元素的所有元素。如果列表中可能包含重复项,则需要做更多的工作(确保最后不会有更多需要的元素)。 此解决方案是O(n)。 选择算法在C++中作
- k比n小得多
- 具有n个双精度值的初始列表是随机排序的
- 找到的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(N)复杂度,因为它不会对元素进行排序,它只是对元素进行排列,使某个N下的每个元素都小于N。
您可以对解决方案进行建模,以匹配这些元素- Heapify maxheap上的第一个k值
- 迭代剩余的n-k值
- 将每个元素与堆顶部的元素进行比较
- 如果新值较低,则执行heappreplace操作(用新值替换最上面的heap元素,然后向下筛选)
各种算法的相对强度研究和总结如下:您可以使用选择排序,选择第一个最低值需要O(n)。一旦我们在位置1上设置了这个最低值,我们就可以重新扫描数据集,找出第二个最低值。直到我们得到第k个最小值。这样,如果k比n小得多,那么我们的复杂度kn等于O(n).该算法与快速排序非常相似。你可以稍微修改一下,得到所有k个最小值的无序列表。我不明白,通过每次进行k个比较来迭代存储k个最大值的列表不是更快吗。为什么需要先对其进行排序。搜索比排序快。我认为
n\u元素
为这个问题提供了更有效的解决方案。O(n log k)是最坏的情况。事实上,该算法通常只比O(n)慢一点。请参阅我的答案以了解更多详细信息,以及运行时间的研究和总结位置的链接。非常好的答案我想知道为什么OP建议首先进行排序,而您只需要迭代元素并在每个步骤进行比较。