我在确定算法的时间和空间复杂性时遇到了问题。 我不确定以下算法的时间复杂度是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),但我有疑问。
是否有计算算法复杂度的公式?
提前谢谢。
答案 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的时间。