分割と征服のテクニックを使って数字(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()
私は同じ問題の2つのバージョンを実装しました
Q1:上記のバージョンのどれが複雑度がθ(lg n)
になっていますか?
Q2:バージョン2の複雑さがθ(lg n)
の場合、その理由は何ですか?バージョン2の問題サイズは2で割っていますが、副問題の数も2であるため、バージョン2はθ(nlg n)
の順に大きくなると感じています。
私の結論はわかりません。あなたが定義することはありませんpow
と呼ばれる機能を使用するように、1つは本当に複雑であるものを言うことができないので、
おかげバージョン1では
バージョン3にfunction squareが追加されました。冗長な計算は何ですか?ありがとう – ajmartin
バージョン3については、θ(lg n)に等しいT(n)= T(n/2)+θ(1)と言うことができます。 (*コストθ(1)を仮定すると) – ajmartin
冗長な計算は、同じ引数を持つ複数の 'power'呼び出しです。基本的な関数呼び出しの実装に応じて、それらはメモされ、実際には1回だけ呼び出されるか、複数回呼び出されることがあります –