2 回答

TA贡献1865条经验 获得超7个赞
这是一种众所周知的算法,称为快速求幂(有时是平方和乘法),其复杂度为O(log(n)). 维基百科有一整页:https ://en.wikipedia.org/wiki/Exponentiation_by_squaring
但是如果你不知道这些信息,一种思考方式是重写你的算法,这样你就可以很容易地找到递归公式。主要困难是应用于奇数和偶数的不同程序。诀窍是将它们组合在一起并仅进行一次递归调用。
def expo(number, exponent):
if exponent == 0:
return 1
elif exponent % 2 == 0:
val = expo(number, exponent / 2)
return val * val
else:
return number * expo(number, exponent - 1) # exponent - 1 is even !
可以改写
def expo(number, exponent):
if exponent == 0:
return 1
elif exponent % 2 == 0:
val = expo(number, exponent / 2)
return val * val
else:
return number * expo(number, (exponent - 1) / 2) ** 2
现在您可以看到,在算法的每一步,exponent都(大致)除以 2(这不再取决于其奇偶性),因此复杂度为log(n).

TA贡献1998条经验 获得超6个赞
首先,您可以考虑最坏情况的算法。因此,如果T(n)
是算法的时间,最坏的情况是T(n) = T(n-1) + c
(c
是一个常数,用于比较、求和、调用函数……)。因此,T(n) = O(n)
。
此外,该声明I think O(n) will not be linear or quadratic
没有意义。如果一个函数在 中O(n)
,则意味着它至多是线性的。因此,它不可能是二次的。
现在您可以更仔细地检查时间复杂度计算,并尝试找到复杂度的严格界限。因为,至少两次连续递归,我们将得到一个偶数值exponent
(因为我们有-1
,如果exponent
是奇数),因此,exponent
到达1
,最多2 log(n)
计算(因为指数将至少除以 2在每 2 次连续递归中)。因此, 的紧界T(n)
是O(log(n))
。
添加回答
举报