2 回答
TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是一種眾所周知的算法,稱為快速求冪(有時(shí)是平方和乘法),其復(fù)雜度為O(log(n)). 維基百科有一整頁:https ://en.wikipedia.org/wiki/Exponentiation_by_squaring
但是如果你不知道這些信息,一種思考方式是重寫你的算法,這樣你就可以很容易地找到遞歸公式。主要困難是應(yīng)用于奇數(shù)和偶數(shù)的不同程序。訣竅是將它們組合在一起并僅進(jìn)行一次遞歸調(diào)用。
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
現(xiàn)在您可以看到,在算法的每一步,exponent都(大致)除以 2(這不再取決于其奇偶性),因此復(fù)雜度為log(n).
TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先,您可以考慮最壞情況的算法。因此,如果T(n)是算法的時(shí)間,最壞的情況是T(n) = T(n-1) + c(c是一個(gè)常數(shù),用于比較、求和、調(diào)用函數(shù)……)。因此,T(n) = O(n)。
此外,該聲明I think O(n) will not be linear or quadratic沒有意義。如果一個(gè)函數(shù)在 中O(n),則意味著它至多是線性的。因此,它不可能是二次的。
現(xiàn)在您可以更仔細(xì)地檢查時(shí)間復(fù)雜度計(jì)算,并嘗試找到復(fù)雜度的嚴(yán)格界限。因?yàn)?,至少兩次連續(xù)遞歸,我們將得到一個(gè)偶數(shù)值exponent(因?yàn)槲覀冇?code>-1,如果exponent是奇數(shù)),因此,exponent到達(dá)1,最多2 log(n)計(jì)算(因?yàn)橹笖?shù)將至少除以 2在每 2 次連續(xù)遞歸中)。因此, 的緊界T(n)是O(log(n))。
添加回答
舉報(bào)
