未排序数组中的前5个元素

时间:2012-08-17 18:35:49

标签: algorithm language-agnostic

给出了一个未排序的数组,我们需要以有效的方式找到前5个元素,我们无法对列表进行排序。

我的解决方案:

  • 查找数组中的max元素。为O(n)

  • 处理/使用后删除此最大元素。

  • 重复步骤1& 2次,k次(在这种情况下为5次)。

时间复杂度: O(kn) / O(n),空间复杂度: O(1)

我认为我们可以在 O(logN)中找到最大元素,因此可以将其改进为 O(klogN)。如果我错了,请纠正我。

我们能做得比这更好吗?我猜使用max-heap会效率低下吗?

PS - 这不是任何作业。

2 个答案:

答案 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)时间。