呼び出しO(h)のバイナリツリーを作成する再帰メソッドのスペースの複雑さはなぜですか?

user197452

この方法を考えると:

int f(int n) {
  if (n <= 0) {
     return 1;
  }
  return f(n - 1) + f(n - 1);
}

次のようにスタック呼び出し/バイナリツリーを作成します。

      n
     /  \
   n-1   n-1
 /   \  /   \
n-2 n-2 n-2 n-2 etc

例えば。n = 3

      3
     /  \
   2     2
  / \    / \
 1   1   1   1
/ \ / \ / \ / \
0 0 0 0 0 0 0 0 

2 ^(n + 1)-1 => 15ノード/呼び出し。時間計算量はO(2 ^ n)です

私の質問は、なぜ空間の複雑さ= O(h)、hは木の高さを表すのですか?この例では3ですか?言い換えると、各メソッド呼び出しに入力変数nに対して1つのメモリ空間がある場合、すべてのメソッド呼び出しに対して1つのメモリ空間があると言えます。O(2 ^ n)メソッド呼び出しがある場合、スペースがO(2 ^ n)と等しくないのはなぜですか?私の参照では、「常にO(N)のみが存在する」と書かれていますが、これは私には意味がありませんでした。

スタックフレームは、メソッド呼び出し、そのパラメーターと変数、および呼び出し元の戻りアドレスを表すものと考えています。これが私の混乱の根源かもしれません。

βξhrαng

これは並行/並列アルゴリズムではないため、関数の出力を計算するために発生するステップの最終的な視覚化は同時ではないことに注意することが重要です。

このようにアルゴリズムを書き直すと、より明白になる可能性があります。

int f(int n) {
  if (n <= 0) {
     return 1;
  }

  int temp1 = f(n - 1);
  int temp2 = f(n - 1);
  return temp1 + temp2;
}

したがって、最初f(n - 1)と2番目の呼び出しはf(n - 1)同時に発生しません。

つまり、任意の時点で、次のような線形呼び出しスタックがあります。

      f(3)
     / 
    f(2)   
   /  
  f(1) 
 /
f(0)

この時点で、サイズ4の呼び出しスタックがあります。f(0)が計算されると、最後の要素要素がスタックからポップされ、サイズ3の呼び出しスタックが作成されます。

      f(3)
     / 
    f(2)   
   /  
  f(1)

この時点で、アルゴリズムはf(1)(の右側のサブツリーf(1)への2番目の呼び出しを評価します

      f(3)
     / 
    f(2)   
   /  
  f(1)
  \
   f(0)

サイズ4のコールスタックが再びあります。次のいくつかのステップで、コールスタックは次のように変換されます。

      f(3)
     / 
    f(2)   
   /  
  f(1)

その後:

      f(3)
     / 
    f(2)   

その後:

      f(3)
     / 
    f(2)
    \
     f(1)

その後:

      f(3)
     / 
    f(2)
    \
     f(1)
    /
   f(0)

その後:

      f(3)
     / 
    f(2)
    \
     f(1)

その後:

      f(3)
     / 
    f(2)
    \
     f(1)
      \
       f(0)

このプロセスは、アルゴリズムが終了するまで続きます。

したがって、アルゴリズムの空間の複雑さはO(h)であると結論付けることができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

__iter __()メソッドを使用してインスタンスでlist()を呼び出すと、再帰が発生するのはなぜですか?

分類Dev

C#ジェネリックでインターフェイスメソッド呼び出しが無視されるのはなぜですか?

分類Dev

再帰呼び出しのスペースの複雑さ

分類Dev

再帰的アルゴリズムのスペースの複雑さは、必然的に少なくとも再帰的呼び出しの深さと同じくらい大きいですか?

分類Dev

イベントリスナーからメソッドを呼び出せないのに、クラスの他の場所で呼び出すことができるのはなぜですか?

分類Dev

再帰メソッドがtrueを返す場合、なぜ再帰呼び出しに入るのですか?

分類Dev

このrubyメソッド呼び出しでスペースが重要なのはなぜですか?

分類Dev

クイックソートアルゴリズムの再帰呼び出しにピボットを含めると、なぜスタックオーバーフローが発生するのですか?

分類Dev

インオーダートラバーサルがそれ自体を2回再帰的に呼び出す場合、AVLツリーはどのようにしてO(log n)の複雑さを持つことができますか?それでO(2 ^ n)になりませんか?

分類Dev

onSubmit内のメソッド呼び出しがエラーをスローするのはなぜですか?

分類Dev

再帰コードがすべてのケースを呼び出さないのはなぜですか?

分類Dev

呼び出しがifステートメント内にあるのに、なぜこの再帰メソッドはそれ自体を呼び出し続けるのですか?

分類Dev

オーバーライドされたメソッドを呼び出すスーパークラス参照がポリモーフィックに見えるのはなぜですか、それがオーバーライドされたメンバー変数を取る場合はそうではありませんか?

分類Dev

リクエストを生成するときにカスタムコールバックが呼び出されないのに、解析メソッドが呼び出されるのはなぜですか?

分類Dev

スーパー実装を呼び出すだけのメソッドオーバーライドがアプリをクラッシュさせるのはなぜですか

分類Dev

再帰スタック全体で同じ配列を操作する方法(または:メソッドの前/次の再帰呼び出しに部分的なソリューションを渡す方法)

分類Dev

List <int> .Remove()メソッドが呼び出し元のメソッドのリストからエントリを削除するのはなぜですか?

分類Dev

コンストラクターでオーバーライド可能なメソッドを呼び出さないのはなぜですか?

分類Dev

再帰でバイナリ ツリーを作成するときのコール スタック エラー

分類Dev

自分自身を(再帰的に)呼び出すメンバーメソッドが無限ループに入らないのはなぜですか?

分類Dev

負の引数が渡されたときに、コードが再帰呼び出しでスタックするのはなぜですか?

分類Dev

再帰的なジェネリックインターフェイスの拡張メソッドが呼び出されると、構造体インスタンスはボックス化されますか?

分類Dev

リンクリストを使用したマージソートスペースの複雑さO(log(n))はなぜですか?

分類Dev

RxAndroidの呼び出しメソッドでエラーを再スローすることは可能ですか?

分類Dev

複合jsfタグがajax呼び出しでリスナーを呼び出さないのはなぜですか?

分類Dev

複合jsfタグがajax呼び出しでリスナーを呼び出さないのはなぜですか?

分類Dev

メソッドをオーバーライドしながらスーパークラスのメソッドを呼び出す目的は何ですか?

分類Dev

バイナリツリーをリンクリストにフラット化(Java)_この再帰的なコードが機能しないのはなぜですか?

分類Dev

ベクター内のshared_ptrでメソッドを呼び出すと、ランタイム例外がスローされるのはなぜですか?

Related 関連記事

  1. 1

    __iter __()メソッドを使用してインスタンスでlist()を呼び出すと、再帰が発生するのはなぜですか?

  2. 2

    C#ジェネリックでインターフェイスメソッド呼び出しが無視されるのはなぜですか?

  3. 3

    再帰呼び出しのスペースの複雑さ

  4. 4

    再帰的アルゴリズムのスペースの複雑さは、必然的に少なくとも再帰的呼び出しの深さと同じくらい大きいですか?

  5. 5

    イベントリスナーからメソッドを呼び出せないのに、クラスの他の場所で呼び出すことができるのはなぜですか?

  6. 6

    再帰メソッドがtrueを返す場合、なぜ再帰呼び出しに入るのですか?

  7. 7

    このrubyメソッド呼び出しでスペースが重要なのはなぜですか?

  8. 8

    クイックソートアルゴリズムの再帰呼び出しにピボットを含めると、なぜスタックオーバーフローが発生するのですか?

  9. 9

    インオーダートラバーサルがそれ自体を2回再帰的に呼び出す場合、AVLツリーはどのようにしてO(log n)の複雑さを持つことができますか?それでO(2 ^ n)になりませんか?

  10. 10

    onSubmit内のメソッド呼び出しがエラーをスローするのはなぜですか?

  11. 11

    再帰コードがすべてのケースを呼び出さないのはなぜですか?

  12. 12

    呼び出しがifステートメント内にあるのに、なぜこの再帰メソッドはそれ自体を呼び出し続けるのですか?

  13. 13

    オーバーライドされたメソッドを呼び出すスーパークラス参照がポリモーフィックに見えるのはなぜですか、それがオーバーライドされたメンバー変数を取る場合はそうではありませんか?

  14. 14

    リクエストを生成するときにカスタムコールバックが呼び出されないのに、解析メソッドが呼び出されるのはなぜですか?

  15. 15

    スーパー実装を呼び出すだけのメソッドオーバーライドがアプリをクラッシュさせるのはなぜですか

  16. 16

    再帰スタック全体で同じ配列を操作する方法(または:メソッドの前/次の再帰呼び出しに部分的なソリューションを渡す方法)

  17. 17

    List <int> .Remove()メソッドが呼び出し元のメソッドのリストからエントリを削除するのはなぜですか?

  18. 18

    コンストラクターでオーバーライド可能なメソッドを呼び出さないのはなぜですか?

  19. 19

    再帰でバイナリ ツリーを作成するときのコール スタック エラー

  20. 20

    自分自身を(再帰的に)呼び出すメンバーメソッドが無限ループに入らないのはなぜですか?

  21. 21

    負の引数が渡されたときに、コードが再帰呼び出しでスタックするのはなぜですか?

  22. 22

    再帰的なジェネリックインターフェイスの拡張メソッドが呼び出されると、構造体インスタンスはボックス化されますか?

  23. 23

    リンクリストを使用したマージソートスペースの複雑さO(log(n))はなぜですか?

  24. 24

    RxAndroidの呼び出しメソッドでエラーを再スローすることは可能ですか?

  25. 25

    複合jsfタグがajax呼び出しでリスナーを呼び出さないのはなぜですか?

  26. 26

    複合jsfタグがajax呼び出しでリスナーを呼び出さないのはなぜですか?

  27. 27

    メソッドをオーバーライドしながらスーパークラスのメソッドを呼び出す目的は何ですか?

  28. 28

    バイナリツリーをリンクリストにフラット化(Java)_この再帰的なコードが機能しないのはなぜですか?

  29. 29

    ベクター内のshared_ptrでメソッドを呼び出すと、ランタイム例外がスローされるのはなぜですか?

ホットタグ

アーカイブ