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))
。
添加回答
舉報