def percolate(int i):
l = 2*i + 1
r = 2*i + 2
max = i
temp = new node()
if (l!=-1 and arr[l] > arr[i]):
max = l
if (r!=-1 and arr[r] > arr[max]):
max = r
if (max != i):
temp = arr[i]
arr[i] = arr[max]
arr[max] = temp
percolate(max)
时间复杂度= O(logn)
但是空间复杂性是多少? O(1)或O(logn)
谢谢, Kuldeep
答案 0 :(得分:1)
percolate
是一个递归函数,其隐式输入是大小为arr
的全局数组n
。该函数可以递归调用自身O(lg n)次,每次调用执行O(1)工作,导致您的O(lg n)运行时间。但是,每次调用都会分配一定量的临时存储空间。
如果实现语言在堆栈上分配这个内存并通过尾递归优化重用堆栈帧,那么算法的总内存使用量确实是O(1)。
但是,如果没有尾递归优化,则为每个调用分配的内存仍在使用中,并且在该特定调用返回之前不会回收,直到它返回下面的所有递归调用之后才会回收。对于O(lg n)高度的调用树,这意味着函数使用O(lg n)内存。
所有这些都表明理论上使用O(1)内存的算法在实践中无法有效地使用O(lg n)内存。