[解決済み] 再帰的関数の空間複雑性
2022-02-09 19:01:27
質問
以下のような関数がある。
int f(int n) {
if (n <= 1) {
return 1;
}
return f(n - 1) + f(n - 1);
}
私は、ビッグ・オー時間複雑性が
O(2^N)
というのも、それぞれの呼び出しが関数を2回呼び出すからです。
私が理解できないのは、なぜスペース/メモリの複雑さが
O(N)
?
解決方法は?
この種の問題へのアプローチとして有効なのは 再帰木 . 見極めるべき再帰関数の特徴は、次の2つです。
- ツリーの深さ 戻り値 は基本ケースまで実行されます)
- ツリーの幅 再帰的な関数呼び出し される)
この場合の再帰関係式は
T(n) = 2T(n-1)
. あなたが正しく指摘したように、時間の複雑さは
O(2^n)
が、再帰木との関係で見てみましょう。
C
/ \
/ \
T(n-1) T(n-1)
C
____/ \____
/ \
C C
/ \ / \
/ \ / \
T(n-2) T(n-2) T(n-2) T(n-2)
このパターンは、次の画像のようなベースケースになるまで続きます。
ツリーのレベルが上がるごとに、nは1ずつ減少します。
nの深さ
基本ケースに到達する前に 各ノードには2つの分岐があり、レベルの総数はn個なので、ノードの総数は次のようになります。
2^n
となり、時間計算量は
O(2^n)
.
各関数呼び出しはプログラムスタックに格納されるため、我々のメモリの複雑さは return 文の数で決まります。一般化すると、再帰的な関数のメモリ複雑度は
O(recursion depth)
. ツリーの深さが示すように、合計で n 個の return 文を持つことになるので、メモリの複雑度は
O(n)
.
関連
-
[解決済み] O(logn)とO(nlogn)の相違点
-
[解決済み] 再帰的関数の空間複雑性
-
[解決済み] f(n) = O(g(n)) もしくは g(n) = O(f(n))
-
[解決済み] ネストされたループのうち、内側のループの反復回数が外側のループの現在の反復回数によって決定されるBig-Oとは何ですか?
-
[解決済み] Low boundとTight boundの違いは何ですか?
-
[解決済み] O(log n)とは具体的にどのような意味ですか?
-
[解決済み】Θ(n)とO(n)の違いは何ですか?)
-
[解決済み】フィボナッチ数列の計算複雑性
-
[解決済み] アクセス時間O(1)」とはどういう意味ですか?
-
[解決済み] 2^nとn*2^nは同じ時間複雑性か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン