如何找到这些算法的时间和空间复杂度?

时间:2018-01-30 14:22:04

标签: time-complexity big-o space-complexity

我在确定算法的时间和空间复杂性时遇到了问题。 我不确定以下算法的时间复杂度是Theta(n / 3)(即Theta(n)),还是Theta(log(n)base 3):

  def f1(x):
      m = len(x)
      found = False
      while m>=1:
         c = m - m/3*3
         if c==1: found=True
         m = m/3

我在计算这些算法的复杂性方面也存在问题:

def f2(x):
   found = False
   n = len(x)-1
   while n!=0 and not found:
      if x[n]==7: found=True
      else: n=n-1
   return found


def f3(x,i,j):
   if (i<j-1):
      k1 = (j-i+1)/3
      k2 = 2*k1
      f3(x,i,i+k1)
      f3(x,i+k1+1,i+k2)
      f3(x,i+k2+1,j)
      for k in range(i,j):
         print x[k]
   else:
      print x[i]

我认为f2()函数的时间复杂度是Theta(n),但我有疑问。

是否有计算算法复杂度的公式?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

f1的时间复杂度为O(log m),log m(base 3)实际上是log m(base 10)/ log 3(base 10),因此我们可以排除常量。虽然可能需要主定理来发现许多时间复杂性,但可以通过跟踪函数调用的数量或循环的数量来找到一些。对于f1,循环数取决于m(根据您的代码,序列x的长度)。 m在每次迭代中除以3,因此路数为log m。

你适合f2的时间。