レベル i では、サブ問題のサイズは ni
はい、そうです。しかし、実行時間がすべての副問題のサイズの合計に等しいと仮定しています。考えてみてください。すでに最初の 2 つのレベルを合計すると が得られますがn + (n - 1) = 2n - 1
、なぜ問題のサイズが大きくなるのでしょうか? 免責事項: 少しわがままで、完全に正確な記述ではありません。
式が実際に言っていること
T(n) = c + T(n-1)
式は、一部の問題を解くには、問題のサイズが 1 小さい問題を解くのに必要な時間と、追加の定数を加えn
たものと同じ時間がかかることを示しています。c
c + T(n - 1)
上記のステートメントを別の言い方をすると、次のようになります。問題がt
特定の問題サイズに時間がかかるとするとt + c
、1 だけ大きい問題サイズに時間がかかります。
n = 0
問題サイズが の場合、これには時間がかかることがわかっていd
ます。2 番目のステートメントによると、サイズがもう 1 の場合n = 1
、 がかかりd + c
ます。d + c + c
ルールをもう一度適用すると、 がかかりますn = 2
。結論として、それにはd + n*c
時間がかかるに違いありませんn
。
これは証明ではありません。これを実際に証明するには、amit で示されている帰納法を使用する必要があります。
正しい再帰ツリー
再帰ツリーには、問題のサイズのみがリストされています。それはほとんど役に立たないです、私は恐れています。代わりに、上記の問題サイズのランタイムをリストする必要があります。
ツリー内のすべてのノードは、特定の問題のサイズに対応しています。そのノードに書き込むのは、問題のサイズにかかる追加の時間です。つまり、ノードのすべての子孫とノード自体を合計して、特定の問題サイズのランタイムを取得します。
このようなツリーをグラフィカルに表現すると、次のようになります。
Tree Corresponding problem size
c n
|
c n - 1
|
c n - 2
|
c n - 3
.
.
.
|
c 2
|
c 1
|
d 0
形式化:既に述べたように、ノードのラベルは、その問題のサイズとそのすべての子孫を解決するために必要な追加のランタイムです。一番上のノードは の問題サイズを表し、に加えて、 を使用して接続されているためn
、ラベルが付いています。c
T(n-1)
|
数式では、次の関係のみを記述します: T(n) = c + T(n-1)
. そのツリーを考えると、これがすべての にどのように適用されるかがわかりますn>=1
。これを次のように書き留めることができます。
T(n) = c + T(n - 1) # This means, `c` plus the previous level
T(n - 1) = c + T(n - 2) # i.e. add the runtime of this one to the one above^
T(n - 2) = c + T(n - 3)
...
T(n - (n - 2)) = c + T(1)
T(n - (n - 1)) = c + T(0)
T(0) = d
用語を下から上に展開できるようになりました。
T(n - (n - 1)) = c + T(0)
T(0) = d
T(n - (n - 2)) = c + T(1)
T(n - (n - 1)) = c + d
T(0) = d
T(n - (n - 3)) = c + T(2)
T(n - (n - 2)) = c + (c + d)
T(n - (n - 1)) = c + d
T(0) = d
T(n - (n - 4)) = c + T(3)
T(n - (n - 3)) = c + (2*c + d)
T(n - (n - 2)) = c + (c + d)
...
T(n) = c + T(n - 1)
T(n - 1) = c + ((n-2)c + d)
T(n) = c + (n-1)c + d = n*c + d
T(n - 1) = (n-1)c + d
サミング1 to n
n+(n-1)+(n-2)+(n-3)+(n-4)+(n-5)+ ...
==> (n+n+n+n+n+ ... )-(1+2+3+4+5+ ... )
==> n - (n(n+1)/2)
1 行目から 2 行目まで、問題を summing から summing に減らし1 to n
まし1 to n-1
た。同じ問題で立ち往生しているため、これはあまり役に立ちません。
3 行目で何をしたかはわかりませんが、1 行目から 2 行目への移行は基本的に正しいです。
これは正しい式でした。
