最大堆的时间复杂度是多少?

时间:2018-03-13 10:03:01

标签: python time-complexity heap

我正在试图找出整个算法的时间复杂度。 Isit O(nlogn)还是O(n)?我一直在网上搜索,有些人说最大堆是O(nlogn),有些是O(n)。我试图获得时间复杂度O(n)。

def max_heapify(A, i):
    left = 2 * i + 1
    right = 2 * i + 2
    largest = i
    if left < len(A) and A[left] > A[largest]:
        largest = left
    if right < len(A) and A[right] > A[largest]:
        largest = right
    if largest != i:
        A[i], A[largest] = A[largest], A[i]
        max_heapify(A, largest)


def build_max_heap(A):
    for i in range(len(A) // 2, -1, -1):
        max_heapify(A, i)
    return A

3 个答案:

答案 0 :(得分:1)

您在问题中的代码重新排列数组元素,使它们满足堆属性,即父节点的值大于子节点的值。 heapify操作的时间复杂度为O(n)。

这是[最小最大堆上的维基百科页面]的摘录(https://en.wikipedia.org/wiki/Min-max_heap#Build

  

创建最小 - 最大堆是通过适应Floyd的线性时间堆构造算法来完成的,该算法以自下而上的方式进行。[10]典型的Floyd的构建堆算法[11]如下:

function FLOYD-BUILD-HEAP (h):
    for each index i from floor(length(h)/2) down to 1 do:
        push-down(h, i)
    return h

此处函数FLOYD-BUILD-HEAP与您的build_max_heap函数相同,而push-down与您的max_heapify函数相同。

一个建议:你的功能命名有点令人困惑。您的max_heapify实际上并没有堆积。它只是heapify操作的一部分。更好的名称可能是push_down(在维基百科中使用)或fix_heap

答案 1 :(得分:0)

我从这个网站上学到了很有帮助。你可以在这里看到它。有一个证明它的复杂性是O(n)和O(logn)。

Check out this link

答案 2 :(得分:0)

堆是一种支持包括插入和检索在内的操作的数据结构。每个操作都有自己的运行时复杂性。

也许您正在考虑 heapsort 的运行时复杂性,这是一种使用堆的排序算法。在这种情况下,运行时复杂度为O(n * log(n))。