1つのインスタンス(整数べき乗指数)からアルゴリズム時間複雑度の解析を行う
2416 ワード
アルゴリズムの時間的複雑さは基本ステップ(basic steps)の考慮にある.
複雑さ
notation
説明
コンスタント
O(1)
基本操作数は定数で入力データの規模に関係なくn=10^6⇒1-2 operations
対数(Logarithmic)
O(logn)
操作数はlog 2 n=10^6⇒30 operations
リニア(Linear)
O(n)
操作数は入力データの規模に比例n=10^6⇒5000 operations
平方(Quadratic)
O(n2)
キューブ(Cubic)
O(n3)
指数(exponential)
O(2n) O(kn) O(n!)
成長は非常に恐ろしい
f(n)=an遍歴乗算 である.再帰版
t(n)=3+t(n−1)t(n)=3k+t(n−k)t(n)=3(n−1)+t(1)=3(n−1)+2
再帰改良版
f(a,n)=an=⎧⎩⎨⎪⎪(a2)n/2=f(a2,n/2),a×(a2)(n−1)/2=a×f(a2,n−12),n is evenn is odd
[1]アルゴリズム複雑度解析
複雑さ
notation
説明
コンスタント
O(1)
基本操作数は定数で入力データの規模に関係なくn=10^6⇒1-2 operations
対数(Logarithmic)
O(logn)
操作数はlog 2 n=10^6⇒30 operations
リニア(Linear)
O(n)
操作数は入力データの規模に比例n=10^6⇒5000 operations
平方(Quadratic)
O(n2)
キューブ(Cubic)
O(n3)
指数(exponential)
O(2n) O(kn) O(n!)
成長は非常に恐ろしい
整数べき乗指数を計算する3つの考え方
f(n)=an
def exp1(a, n):
r = 1
while n:
r *= a
n -= 1
return r
その基本手順は(一次反復):判断(while)+乗算+減算==3であるため、サイクル全体の時間複雑度は:3 n+2⇒O(n)def exp2(a, n):
if n == 1:
return a
else:
return a*exp2(a, n-1)
再帰版の時間的複雑さは、依然として再帰形式で分析されている.t(n):現在を識別すると、t(n)=3+t(n−1)となり、そのうち3は、1回の判断、1回の乗算、1回の減算を表す.t(n)=3+t(n−1)t(n)=3k+t(n−k)t(n)=3(n−1)+t(1)=3(n−1)+2
f(a,n)=an=⎧⎩⎨⎪⎪(a2)n/2=f(a2,n/2),a×(a2)(n−1)/2=a×f(a2,n−12),n is evenn is odd
def exp3(a, n):
if n == 1:
return a
return exp3(a**2, n//2) if n%2 == 0 a*exp3(a**2, n//2)
nが偶数の場合、t(n)=6+t(n/2);nが奇数の場合、t(n)=6+t(n−1)=6+6+t(n−12)であるため、t(n)=12+t(n/2)=12×log 2 n+t(1)時間複雑度:logn References
[1]アルゴリズム複雑度解析