web-dev-qa-db-ja.com

階乗再帰アルゴリズムの複雑さ

今日、クラスで先生は黒板にこの再帰的階乗アルゴリズムを書きました:

_int factorial(int n) {
   if (n == 1) 
       return 1;
   else 
       return n * factorial(n-1);
}
_

彼女は、T(n-1) + 1のコストがあると言いました。

次に、反復メソッドで、彼女はT(n-1) = T(n-2) + 2 = T(n-3) + 3 ... T(n-j) + jと言ったので、アルゴリズムは_n - j = 1_のときに停止するので、_j = n - 1_。

その後、彼女はjT(n-j) + jに置き換え、T(1) + n-1を取得しました。

彼女は、そのためにn-1 = 2(ログ2n-1)、アルゴリズムのコストは指数関数的です。

私は最後の2つのステップを本当に失いました。誰かが私にそれらを説明してもらえますか?

18

このアルゴリズムの分析から始めましょう。完了した作業の合計量について、再帰関係を作成できます。基本ケースとして、サイズ1の入力でアルゴリズムが実行されるときに1つの作業単位を実行するため、

T(1)= 1

サイズn + 1の入力の場合、アルゴリズムは関数自体内で1作業単位を実行し、サイズnの入力で同じ関数を呼び出します。だから

T(n + 1)= T(n) + 1

再発の条件を拡張すると、それが得られます

  • T(1)= 1
  • T(2)= T(1) + 1 = 2
  • T(3)= T(2) + 1 = 3
  • T(4)= T(3) + 1 = 4
  • ...
  • T(n)= n

したがって、一般に、このアルゴリズムを完了するにはn個の作業単位が必要になります(T(n) = n)。

次に先生が言ったことは

T(n)= n = 2ログ2 n

2ログ2バツ =ゼロ以外のxの場合、xは累乗と対数が互いに逆の操作であるためです。

質問は、この多項式時間ですか、指数時間ですか?これを擬似多項式時間として分類します。入力xを数値として扱う場合、ランタイムは実際にはxの多項式です。ただし、アルゴリズムの実行時間は、問題への入力を指定するために使用されるビット数に関して多項式でなければならないように、多項式時間が正式に定義されます。ここで、数値xはΘ(log x)ビットでのみ指定できるため、2のランタイムログx 技術的には指数時間と見なされます。これについては長さとして この以前の回答 で書きましたが、より詳細な説明についてはこれを参照することをお勧めします。

お役に立てれば!

19
templatetypedef