時間の複雑さはO(n)
、if
ステートメントがそれに実際に影響を与えないためです。ステートメントの複雑さは、if
十分な大きさのデータセットにわたって一定です。
ステートメントは、if
実際には 3 の倍数または 5 の倍数の反復で異なる量の作業を行う可能性がありますが、ループ反復ごとの余分な作業の量は に依存しませんn
。n
実際、大きくなるにつれて一定に平均化されます。
余談ですが、コードが間違っている可能性があると思います。15 の倍数では、 と の両方が出力fizz
され buzz
ます。
編集のレベル (追加されたブレークダウン) で実行したい場合は、各ステートメントに任意のコストを割り当てるだけで済みます (このコストは、そのステートメントの 1 回の実行に対して一定です)。ステートメントが実行されます。ci
たとえば、最初のif
シーケンスn
の実行時間は、print "fizz"
それらの 3 分の 1 で実行されn/3
ます。したがって、次の表のようになります。
cost times
Fizz-Buzz(n)
for i = 1 to n c1 n
if (n % 3 == 0) c2 n
print "fizz" c3 n / 3 [call this a]
else
if (n % 5 == 0) c4 n - a
print "buzz" c5 (n - a) / 5 [call this b]
else
print n c6 n - a - b
あなたの例に従ってそれらをすべて合計し( と の式を代入しますn
)a
、最終b
的には に依存するもの、つまりアルゴリズムになります。次のようになります。n
O(n)
c1*n + c2*n + c3*n/3 + c4*(n-a) + c5*(n-a)/5 + c6*(n-a-b)
= c1*n + c2*n + (c3/3)*n + c4*(n-n/3) + (c5/5)*(n-n/3) + c6*(n-n/3-(n-n/3)/5)
= c1*n + c2*n + (c3/3)*n + c4*(2/3)*n + (c5/5)*(2/3)*n + c6*(n-n/3-(n-n/3)/5)
= c1*n + c2*n + (c3/3)*n + (c4*2/3)*n + (c5*2/15)*n + c6*(n*8/15)
= c1*n + c2*n + (c3/3)*n + (c4*2/3)*n + (c5*2/15)*n + (c6*8/15)*n
/ 1 2 2 8 \
= ( c1 + c2 + - c3 + - c4 + -- c5 + -- c6 ) * n
\ 3 3 15 15 /
括弧内のこれらの値はすべて実際には定数であり (定数の倍数であるため)、全体は の定数乗数ですn
。
さて、上記の方程式に小さな間違いを見つけたとしても、私はそれほど驚かないでしょう。私はこのレベルの数学をかなりの年にわたって行っていません。宿題とあなたはそれを逐語的にコピーしてみてください:-)
しかし、あなたが見つけそうな唯一の間違いは、定数乗数自体の値です。それはまだいくつかの説明の一定の乗数になるでしょう、私はそれを保証します.