何かを作るとき、
これまで、
これまでの連載とあわせれば、
![図77.1 ベテランこそひな形の価値を知っている 図77.1 ベテランこそひな形の価値を知っている](/assets/images/book/serial/2007/java-calculation/thumb/TH800_0077-01.png)
計算量:O (na )となる場合
次のコードはO (n2 )になります。n回の繰り返しをn回繰り返すのですから、
入力量nが大きくなると、
public void compute(int n) {
for(int i = 0; i < n; ++ i){
for(int j = 0; j < n; ++j){
proc();//なにか処理
}
}
}
n回ループをa個
O (na )
計算量:O (an )となる場合
次のコードはO (2n )となります。確認できますか?
public void compute(int n) {
if(n == 0){
proc();//なにか処理
return;
}
for(int i = 0; i < 2; ++i){
compute(n - 1);
}
}
初学者にとって、
いきなり大きな入力を試さず、proc
の実行回数を用います。関数proc
が実行された回数を数えて下さい。
compute(1)
n == 0 is false
for(i=0..1,i=0)
compute(0)
n == 0 is true
proc() ............(1)
for(i=0..1,i=1)
compute(0)
n == 0 is true
proc() ............(2)
end of for
end of compute(1)
proc()
は2回実行されました。では、
compute(2)
n == 0 is false
for(i=0..1,i=0)
compute(1)
n == 0 is false
for(i=0..1,i=0)
compute(0)
n == 0 is true
proc() ............(1)
for(i=0..1,i=1)
compute(0)
n == 0 is true
proc() ............(2)
end of for
end of compute(1)
for(i=0..1,i=1)
compute(1)
n == 0 is false
for(i=0..1,i=0)
compute(0)
n == 0 is true
proc() ............(3)
for(i=0..1,i=1)
compute(0)
n == 0 is true
proc() ............(4)
end of for
end of compute(1)
end of for
end of compute(2)
proc()
は4回実行されました。さらに実行の様子を探って見ると、proc()
は2n実行されるようです。ということで、
O (an )
問題 次のソースコードの計算量をオーダー表示しましょう。
このソースコードが実行されたとき、
public void compute(int n) {
if(n == 0){
proc();//なにか処理
return;
}
for(int i = 0; i < n; ++i){
compute(n - 1);
}
}
解説
問題 次のソースコードの計算量をオーダー表示しましょう。
小さな場合から実行の様子を追ってみましょう。先ずはn =1から。
compute(1)
n == 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(1)
end of for
end of compute(1)
proc()
は1回実行されました。次はn =2で実行してみます。
compute(2)
n == 0 is false
for(i=0..1,i=0)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(1)
end of for
end of compute(1)
for(i=0..1,i=1)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(2)
end of for
end of compute(1)
end of for
end of compute(2)
proc()
は2回実行されました。O (n )でしょうか?
compute(3)
n == 0 is false
for(i=0..2,i=0)
compute(2)
n == 0 is false
for(i=0..1,i=0)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(1)
end of for
end of compute(1)
for(i=0..1,i=1)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(2)
end of for
end of compute(1)
end of for
end of compute(2)
for(i=0..2,i=1)
compute(2)
n == 0 is false
for(i=0..1,i=0)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(3)
end of for
end of compute(1)
for(i=0..1,i=1)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(4)
end of for
end of compute(1)
end of for
end of compute(2)
for(i=0..2,i=2)
compute(2)
n == 0 is false
for(i=0..1,i=0)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(5)
end of for
end of compute(1)
for(i=0..1,i=1)
compute(1)
n== 0 is false
for(i=0..0,i=0)
compute(0)
n == 0 is true
proc() ............(6)
end of for
end of compute(1)
end of for
end of compute(2)
end of for
end of compute(3)
proc()
は6回実行されました。6=3!=n!で間違いないようです。擬似コードで示した実行の様子を見ても、
O (n! )
今回はここまで
代表的な計算量のパターンを一通り紹介しました。計算量とそのコードの例を知ることで