我使用分而治之技术实现了一个为数字(a ^ n)供电的程序。我实现了同一个问题的两个版本:
版本1:
def input_params():
a=input('Input \'a\' & \'n\' for a^n:')
n=input('')
result=power(a,n)
print (result)
def power(a,n):
if n<=1:
return a
elif n%2==0:
return pow(power(a,n/2),2)
else:
return pow(power(a,(n-1)/2),2)*a
if __name__ == "__main__":
input_params()
版本2:
def input_params():
a=input('Input \'a\' & \'n\' for a^n:')
n=input('')
result=power(a,n)
print (result)
def power(a,n):
if n<=1:
return a
elif n%2==0:
return power(a,n/2)*power(a,n/2)
else:
return power(a,(n-1)/2)*power(a,(n-1)/2)*a
if __name__ == "__main__":
input_params()
版本3:
def input_params():
a=input('Input \'a\' & \'n\' for a^n:')
n=input('')
result=power(a,n)
print (result)
def power(a,n):
if n<=1:
return a
elif n%2==0:
return square(power(a,n/2))
else:
return square(power(a,(n-1)/2))*a
def square(num):
return num*num
if __name__ == "__main__":
input_params()
Q1:上述哪个版本的复杂度为θ(lg n)
?
Q2:如果版本2的复杂度为θ(lg n)
,为什么?因为尽管版本2中的问题大小除以2,但子问题的数量也是两个,所以我觉得版本2将按θ(nlg n)
的顺序增长。
我不确定我的结论。
由于
答案 0 :(得分:1)
在版本1中,没有答案,因为你使用了一个你从未定义过的名为pow
的函数,所以无法真正说出复杂性是什么。
在版本2中,存在冗余计算,因此答案取决于您是否将这些冗余计算视为复杂性的一部分(因为它们很容易被忽略)。
尝试使用名为square
的函数编写版本3,并包含square
的定义
在所有情况下,您都需要对使用的基本操作(*
,/
和+
)的成本进行一些假设。您可能想要假设它们都花费O(1),但您应该在分析中明确说明。