给出了一个未排序的数组,我们需要以有效的方式找到前5个元素,我们无法对列表进行排序。
我的解决方案:
查找数组中的max元素。为O(n)
处理/使用后删除此最大元素。
重复步骤1& 2次,k次(在这种情况下为5次)。
时间复杂度: O(kn) / O(n),空间复杂度: O(1)。
我认为我们可以在 O(logN)中找到最大元素,因此可以将其改进为 O(klogN)。如果我错了,请纠正我。
我们能做得比这更好吗?我猜使用max-heap会效率低下吗?
PS - 这不是任何作业。
答案 0 :(得分:8)
如果你可以使用一个辅助堆(顶部有一个带负号的最小堆)你可以在O(nlogm)
中执行此操作,其中n
是列表长度,m
是跟踪的最大元素。
由于aux堆具有固定的最大大小(5),我认为可以将该结构上的操作视为O(1)
。在这种情况下,复杂性为O(n)
。
伪代码:
foreach element in list:
if aux_heap.size() < 5
aux_heap.add(element)
else if element > aux_heap.top()
aux_heap.remove_top()
aux_head.add(element)
答案 1 :(得分:4)
使用partial quicksort我们可以实现O(n),这不需要任何辅助空间。使用最大堆,与其他解决方案一样,需要O(n log k)时间。