次の問題があります。
次のコードでは、理由とともに、関数の時間計算量を示します。
同じタスクを実行するが、時間の複雑さが桁違いに改善される関数を作成します。(時間または空間の) 複雑さが大きい関数は評価されません。
コード:
int something(int[] a) {
for (int i = 0; i < n; i++)
if (a[i] % 2 == 0) {
temp = a[i];
for(int j = i; j > 0; j--)
a[j] = a[j-1];
a[0] = temp;
}
}
私はtemp = a[i]
、最悪の場合の代入は の時間で行わn
れるため、 の時間複雑度n
がそれに割り当てられ、a[j] = a[j-1]
実行n(n+1)/2
時間であるため、 の時間複雑度の値がそれに割り当てられ、それらを合計すると の時間複雑度が返され、を削除すると考えています定数はと の複雑さにつながります。(n2+n)/2
n+0.5n2+0.5n
2n+n2
n2
桁違いの改善の場合:
int something(int[] a) {
String answer = "";
for (int i = 0; i < n; i++) {
if (a[i] % 2 == 0) answer = a[i] + answer;
else answer = answer + a[i];
}
for (int i = 0; i < n; i++)
a[i] = answer.charAt(i);
}
最初の for ループ内のコードはn
回実行され、2 番目の for ループn
時間では、合計すると の時間複雑度の数値が得られ2n
ます。
これは正しいです?それとも私は何か間違ったことをしていますか?