私はスペース(メモリ)に関する質問がある擬似コードのこの特定の部分の複雑さ:このアルゴリズム(nまたはlog(n))の空間複雑度はどれくらいですか?
int b(int n, int x) {
int sol = x;
if (n>1) {
for (int i = 1; i <= n; i++) {
sol = sol+i;
}
for (int k=0; k<3; k++) {
sol = sol + b(n/3,sol/9);
}
}
return sol;
}
コードが呼び出されます:b(n,0)
私の意見は、スペースの複雑さが直線的に進行していること、であるが、それはありますn
は、入力としてn
が大きくなるため、変数宣言の量も増加します(sol
)。
私の友人は、それはlog(n)
でなければならないと主張します。私は彼の説明をあまり得ていない。しかし、彼は第2のfor
ループに関する何かを言い、3つの再帰呼び出しが順番に起こることを示しました。
n
またはlog(n)
は正しいですか?
申し訳ありませんが、再帰の最大深度が 'O(log(n))'にある理由がわかりません。なぜ、例えば 'O(sqrt(n))'ではないのですか?それが 'O(log(n))'であれば、対数にはどのような基底があり、なぜそうですか? –
nの関数呼び出しから始めます。それから、bを呼び出すたびに、nを3で割ってn/3、n/9、n/27 ...、n/3^d(dは反復の深さ)になります。分母は**指数関数的に増加します** - これは、nからnに1に達するために必要なステップのログ数(これは反復が止まるときです)です。 – mateuszlo
ああ、私は今それを得ると思います。しかし、ログベースが3になるはずはないのですか?そのような 'O(log_3(n))'? –