T(n) の値の式から始めましょう。私たちは次のことを知っています。
- 引数として 0 または 1 を指定して f を呼び出すと、時間がかかります O(1)
- より大きな値で f を呼び出すと、f(n / 2) が 3 回呼び出され、一定量の他の作業が行われます。
したがって、次の再帰を得ることができます。
- T(1) ≤ 1
- T(n) ≤ 3T(n / 2) + 1
ここでは、「+ O(1)」という用語の代わりに「+ 1」という用語を使用していることに注意してください。これは数学的には不確かですが、いずれにせよ big-O 表記で表される最終結果を探しているので、これはそれほど問題にはなりません。
では、これを解決するにはどうすればよいでしょうか。1 つのオプションは、n に任意の値を差し込んで、何が起こるかを確認することです。(n > 1 と仮定して) から始めます。
T(n) ≤ 3T(n / 2) + 1
ここで、T(n / 2) の呼び出しについて考えてみましょう。n / 2 > 1 の場合、次のようになります。
T(n) ≤ 3T(n / 2) + 1
≤ 3(3T(n / 4) + 1) + 1
= 9T(n / 4) + 3 + 1
それでは、これをゲインに拡張しましょう。
T(n) ≤ 9T(n / 4) + 3 + 1
≤ 9(3T(n / 8) + 3) + 3 + 1
= 27T(n/8) + 9 + 3 + 1
この時点で、パターンが出現していることがわかります。再帰を i 回繰り返した後、完了した作業の合計は次のようになります。
T(n) = 3 i T(n / 2 i ) + sum(i = 0 から i - 1)3 i
このプロセスは、i ≈ lg n のときに発生するn / 2 i ≤ 1 のときに終了します。lg n をプラグインすると、
T(n) ≤ 3 lg n T(1) + sum(i = 0 から i - 1)3 i )
≤ 3 lg n + sum(i = 0 ~ i - 1)3 lg n
さて、 3 lg n = 3 (log3 n / log3 2) = 3 log3 n 1 / log3 2 = n 1 / log3 2なので、この全体は
T(n) ≤ n 1 / log3 2 + sum(i = 0 から (lg n) - 1)3 i
等比級数の和の式を使用すると、この最後の項は (3 lg n - 1) / 2 であり、これは最終的に O(n 1 / log3 2 ) に展開されるため、全体としてこの式は O(n 1 / log 3 2)。
しかし、この式は本当に醜いです。単純化できますか?さて、これがあります:
1 / ログ3 2 = ログ2 3
これにより、実行時間は O(n lg 3 ) で、約 O(n 1.58 ) であることがわかります。
お役に立てれば!