実行時間O(2^N)のアルゴリズムは、サイズN-1の2つのより小さい問題を再帰的に解くことによってサイズNの問題を解決する再帰アルゴリズムです。
このプログラムは、例えば、擬似コードにおけるN個のディスクの有名な「タワーハノイの」課題を解決するために必要なすべての移動
void solve_hanoi(int N, string from_peg, string to_peg, string spare_peg)
{
if (N<1) {
return;
}
if (N>1) {
solve_hanoi(N-1, from_peg, spare_peg, to_peg);
}
print "move from " + from_peg + " to " + to_peg;
if (N>1) {
solve_hanoi(N-1, spare_peg, to_peg, from_peg);
}
}
レッツT(N)が要する時間であることを出力しN個のディスク。
我々は持っている:
T(1) = O(1)
and
T(N) = O(1) + 2*T(N-1) when N>1
をあなたが繰り返し最後の項を展開すると、あなたが得る:
T(N) = 3*O(1) + 4*T(N-2)
T(N) = 7*O(1) + 8*T(N-3)
...
T(N) = (2^(N-1)-1)*O(1) + (2^(N-1))*T(1)
T(N) = (2^N - 1)*O(1)
T(N) = O(2^N)
を実際にこれを理解するには、あなただけの漸化式でその特定のパターンを知っている必要があります指数関数的な結果につながります。一般にT(N) = ... + C*T(N-1)
とC > 1
はO(x^N)を意味します。参照:
https://en.wikipedia.org/wiki/Recurrence_relation
N番目のフィボナッチ数を計算する素朴な再帰関数は、これのもう一つの古典的な例です。 –
私はまだそのコードを見て2^nを導くことはできませんが、これは非常に役立ちます。 – dlkulp
私は助けてくれる説明を追加しました –