全プロセスの詳細解説
-
単純なfib(10)が177回の呼び出しを行う場合の呼び出し回数の閉形式 6 ステップ
単純な
fib(10)は 177 回、fib(11)は 287 回の呼び出しを行うとツールは示しています。呼び出し回数の閉形式(一般項)を求めて証明してください。そして、一秒間に 108 回の呼び出しを処理できるコンピュータにおいて、単純なフィボナッチ数列が一秒間でどこまで計算できるか導き出してください。-
それぞれの回数に 1 を足すと、178 と 288 になります。どちらも偶数であり、その半分は 89 と 144 です。これは F11 と F12 に一致します。したがって、F(1) = F(2) = 1 としたとき、推測される式は C(n) = 2F(n+1) − 1 となります。
-
この二倍という数字がどこから来るのかは、木を見るとわかります。すべての内部ノードは正確に二回の呼び出しを行い、葉は一度も呼び出しを行いません。したがって、L 個の葉を持つ木には L − 1 個の内部ノードがあり、ノードの総数は 2L − 1 となります。ツールによれば、n = 10 でのベースケースは 89 個です。だから 2 × 89 − 1 = 177 なのです。
-
まずはベースケースです。
fib(0)とfib(1)は再帰せずに値を返すため、C(0) = C(1) = 1 となります。そして、2F(1) − 1 と 2F(2) − 1 はどちらも 1 に等しくなります。 -
次に帰納法のステップです。n − 1 と n − 2 においてこの式が成り立つと仮定します。n での呼び出しは、一つのノードとその下にある二つの部分木を足したものです。そこに含まれる二つのフィボナッチ数は、数列の定義そのものによって自然に一つにまとまります。n = 11 とすると 2 × 144 − 1 = 287。ツールが表示する値と完全に一致します。
-
ここで木から離れましょう。ビネの公式は φ = 1.6180、|ψ| < 1 として F(m) = (φm − ψm)/√5 を与えます。そのため F(m) は φm/√5 を最も近い整数に丸めた値となり、C(n) ≈ 2φn+1/√5 と近似できます。一秒間に 108 回の速度であれば、一秒間でちょうど 108 回の呼び出しを行えます。これにより、φn+1 は 1.1180 × 108 に固定されます。
-
対数をとります。ln(1.1180 × 108) = 18.5323、ln φ = 0.4812 なので、n + 1 = 38.51 となり、n = 37.5 と求められます。端数分の呼び出しは完了しないため、切り捨てます。
解答
n = 37。ツールを見れば前後の値を確認できます。n = 37 では 78,176,337 回、n = 38 では 126,491,971 回の呼び出しです。これ以降は n が 1.44 増えるごとに作業量が二倍になります。ln 2 / ln φ = 1.44 だからです。一方、n = 37 のとき、独立した部分問題のカードには 38 と表示されます。三十八の質問に答えるために七千八百万の呼び出しを行う。この一行こそが、動的計画法を学ぶ最大の理由です。
-
-
二本より遅く育つ三本の枝 6 ステップ
1〜3段ずつ上る階段は各ノードで自分を三回呼び、ハノイの塔は二回呼びます。n=20の階段上り(3分岐)を読み込み、二つの木のどちらが速く育つかを求め、分岐数が指標としてどれだけ役に立つかを判断してください。
-
漸化式は絵からではなく定義から読み取ります。ノード自身の呼び出しが1回、そこから n − 1、n − 2、n − 3 で3回、そして2以下なら再帰せずに返ります。
-
呼び出し回数が幾何級数的に増えると仮定して C(n) ≈ A xⁿ を代入します。両辺を x の n − 3 乗で割ると、先頭の1は低次の雑音として置き去りになり、三次方程式が残ります。その唯一の実根が 1.8392868、トリボナッチ定数です。
-
同じ手順を残る二つの定義に当てはめます。フィボナッチは n − 1 と n − 2 で自分を呼ぶので x² = x + 1 となり、根は φ = 1.6180340 です。ハノイは n − 1 で二回呼ぶので x = 2 となり、解くものは何もありません。
-
信じる前に確かめます。n を29にして呼び出し回数のカードを読み、30にしてもう一度読み、割ります。階段は1.83929、フィボナッチは1.61803、ハノイはちょうど2。三つとも小数第五位まで一致します。
-
根が教えてくれないのは回数そのものです。1.8393²⁰ は196,331ですが、カードの表示は128,287。前に0.65という係数が付いています。ハノイの呼び出しはちょうど 2ⁿ⁺¹ − 1 で、係数は2です。ベースケースがこの定数を決め、漸化式が根を決めます。そして最後に勝敗を決めるのは根だけです。
-
その最後は、ここではすぐに訪れます。n = 20 でハノイの呼び出しは階段の16.3倍、n = 30 では37.8倍になります。この比は8.3ステップごとに倍になります。ln 2 を ln(2 ÷ 1.8393) で割ると8.27だからです。
解答
速く育つのはハノイです。2 対 1.8393。三本目の枝は、階段にとって払えないほどの負担ではありませんでした。分岐数は増加率の上限であり、それに届くのは子がすべて一段だけ小さいときだけです。階段は三回の呼び出しのうち二回を、2および3だけ小さい引数に使っています。それらの部分木は十分に軽く、増えたはずの一本分にまで積み上がることがありません。
手元に残す価値があるのは手順のほうです。誰も先に解いていない定義にも使えるからです。子の数を数え、それぞれが引数をいくつ減らすかを見て、最大の減少分を指数とする x を、残りの減少分の x の和と等しいと置き、最大の実根を取る。ひとつだけ注意が要ります。これは素朴な木についての事実であり、その素朴な木は誰も書かないものだということです。独立した部分問題のカードは、n = 20 で階段が21、ハノイも21を示します。メモ化を入れれば指数そのものが消え、増加率は問題でなくなります。 -
学習の道すじ