computational complexityaoba.cc.saga-u.ac.jp/.../text/computationalcomplexity.pdfcomputational...
TRANSCRIPT
計算量Computational Complexity計算機アルゴリズム特論:2017年度只木進一
計算量
アルゴリズムの良さをはかる尺度計算時間、記憶領域、理解しやすさ、プログラムへの変換の容易さ、等々
時間計算量(Time Complexity)計算に要する時間講義ではこちらを主に議論
領域計算量(Space Complexity)計算に要する記憶領域
2
計算量
稼働させる計算機に依存CPU、メモリ、ディスクに依存仮想的計算機で比較
入力サイズに依存入力データのサイズ𝑛𝑛の関数として評価漸近的計算量に着目:𝑛𝑛→大のときの挙動
3
入力サイズが同じでも差探索データがリストの先頭なら速いが、末尾なら遅い
平均値、最悪値(最も悪い場合の値)で議論
どの部分に注目するか律速過程を見極める
4
例:多項式の計算
計算手順で演算回数が異なる係数𝑎𝑎𝑖𝑖と変数𝑥𝑥を与えて、関数の値𝑓𝑓(𝑥𝑥)を求めるのに必要な計算𝑥𝑥のべきを求めるための乗算4回係数と𝑥𝑥のべきとの乗算4回加算4回合計12回
( ) 4 3 24 3 2 1 0x a x a x af x a x a= + + + +
5
double polynomial(double x, double a[])int n=a.length;double v=a[0];double xx=x.:for ( int i=1; i<n; i++)
v += xx * a[i];xx *= x;
return v;
6
Hornerの方法
乗算4回+加算4回
( ) ( )( )( )( )4 3 2 1 0x a x a xf a x a x a= + + + +
7
double polynomial(double x, double a[])int n=a.length;double v=a[n-1];for ( int i=1; i<n; i++)
v += v*x + a[i];return v;
8
例:多項式の計算:一般化
律儀な方法𝑛𝑛次の項: 2𝑛𝑛回の乗算𝑛𝑛回の加算
( ) ( ) ( )0
1 52 2
2 2
n
k
n nk nP
n nn n
=
+ += + = + =∑
9
Hornerの方法一つの括弧を閉じる:乗算と加算が各1回
( )02 2
n
kP n n
=
= =∑
10
例:逐次探索
リストの長さ𝑁𝑁要素中の一つを探索
位置𝑖𝑖にある場合存在確率1/𝑁𝑁
比較回数𝑖𝑖 + 1
10 15 30 50 91817037
1
1 12
N
k
NkN =
+=∑
11
計算量の評価
データのサイズ𝑛𝑛が大きいときに、計算量や計算時間が 𝑛𝑛に対してどのように増大するか定数倍にはあまり関心はない
周辺の演算の影響
𝑛𝑛に対して最も速く増大する項に関心がある𝑛𝑛が大きくなった時に最も重要
12
オーダー記法
二つの関数𝑓𝑓 𝑛𝑛 と𝑔𝑔 𝑛𝑛 を考える
このとき
𝑛𝑛が大きいとき、𝑓𝑓 𝑛𝑛 は𝑔𝑔 𝑛𝑛 より増加が速くない通常は、𝑔𝑔 𝑛𝑛 は簡単な関数形
( )( )
0 limn g n
cf n
∞→≤ ≤
( ) ( )( )f n O g n∈
13
他のオーダー記法記法 定義
𝑓𝑓 𝑛𝑛 ∈ 𝑂𝑂(𝑔𝑔 𝑛𝑛 )lim𝑛𝑛→∞
𝑓𝑓(𝑛𝑛)𝑔𝑔(𝑛𝑛)
≤ 𝑐𝑐
𝑓𝑓 𝑛𝑛 ∈ 𝑜𝑜(𝑔𝑔 𝑛𝑛 )lim𝑛𝑛→∞
𝑓𝑓(𝑛𝑛)𝑔𝑔(𝑛𝑛)
= 0
𝑓𝑓 𝑛𝑛 ∈ Ω(𝑔𝑔 𝑛𝑛 )lim𝑛𝑛→∞
𝑓𝑓(𝑛𝑛)𝑔𝑔(𝑛𝑛)
≥ 𝑐𝑐
𝑓𝑓 𝑛𝑛 ∈ ω(𝑔𝑔 𝑛𝑛 )lim𝑛𝑛→∞
𝑓𝑓(𝑛𝑛)𝑔𝑔(𝑛𝑛)
= ∞
𝑓𝑓 𝑛𝑛 ∈ Θ(𝑔𝑔 𝑛𝑛 ) 𝑓𝑓 𝑛𝑛 = 𝑂𝑂 𝑔𝑔 𝑛𝑛 ∧𝑓𝑓 𝑛𝑛 = Ω(𝑔𝑔 𝑛𝑛 )
14
( )3O n
( )3nΘ
( )3nΩ
( )3o n ( )3nω
3 23 4n n+22n n+
4 23n n−
3 4n n−
オーダーの関係15
例:多項式
律儀な方法::𝑂𝑂(𝑛𝑛)
16
Insertion Sort基本的考え方
大きさ10の配列の先頭5個は整列済みとする
6番目の要素”D”を適切な位置に挿入する順に左に移動し、より小さい要素の手前に挿入
B M LRXKDTHE
B H LRXKTMED
17
Insertion Sort基本的考え方:詳細
配列𝑑𝑑0番から𝑖𝑖 − 1番までは整列済み𝑗𝑗 = 𝑖𝑖から𝑗𝑗を𝑑𝑑𝑗𝑗 < 𝑑𝑑𝑗𝑗−1である限り一つずつ下げ、𝑑𝑑𝑗𝑗と𝑑𝑑𝑗𝑗−1を入れ替える
18
Insertion Sortアルゴリズム
for ( 𝑖𝑖 = 1; 𝑖𝑖 < 𝑛𝑛 ; 𝑖𝑖 + +) for ( 𝑗𝑗 = 𝑖𝑖;𝑗𝑗 > 0 && 𝑑𝑑_𝑗𝑗 < 𝑑𝑑_𝑗𝑗 − 1 ; 𝑗𝑗 − −)
exch (𝑗𝑗,𝑗𝑗 − 1)
19
内側のループの要素入替回数(最大)1回目:12回目:2最後:𝑛𝑛 − 1
要素入替回数(最大)1
1
( 1)2
n
k
n nk−
=
−=∑
2( )O n
20
21