我正在试图找出整个算法的时间复杂度。 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
答案 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)。
答案 2 :(得分:0)
堆是一种支持包括插入和检索在内的操作的数据结构。每个操作都有自己的运行时复杂性。
也许您正在考虑 heapsort 的运行时复杂性,这是一种使用堆的排序算法。在这种情况下,运行时复杂度为O(n * log(n))。