以下代码段中的空间复杂性是多少?

时间:2014-08-19 20:05:43

标签: algorithm data-structures space-complexity

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

1 个答案:

答案 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)内存。