ザカリー:
この繰り返しが与えられたとしましょう:
r(n) = 2*r(n-2) + r(n-1); r(1) = r(2) = 1
これは実際、マスター定理の形をとっているのでしょうか? もしそうなら、それは言葉で何を言っているのですか?
あなたの再帰関係が言っていることは、「n」をパラメーターとして(入力しているデータセットの総数を表す)「r」の関数の場合、データセットのn番目の位置で得られるものは何でもあると思いますn-1 番目の位置の出力に n-2 番目の位置の結果の 2 倍を加えたもので、非再帰的な作業は行われません。再帰関係を解決しようとするとき、再帰を伴わない方法でそれを表現しようとしています。
しかし、それがMaster Theorem Methodの正しい形だとは思いません。あなたの声明は、「定数係数を持つ二次線形回帰関係」です。どうやら、私の古い Discrete Math の教科書によると、それが再帰関係を解くために必要な形式です。
彼らが与えるフォームは次のとおりです。
r(n) = a*r(n-1) + b*r(n-2) + f(n)
「a」と「b」は定数であり、f(n) は n の関数です。あなたのステートメントでは、a = 1、b = 2、および f(n) = 0 です。f(n) がゼロに等しいときはいつでも、再帰関係は「同種」として知られています。だから、あなたの表現は均質です。
f(n) = 0 であるため、マスター メソッド定理を使用して同次再帰関係を解決できるとは思いません。ゼロにはなりません。私はこの分野の専門家ではないので、間違っているかもしれませんが、Master Method を使用して同種再帰関係を解決できるとは思いません。
同種の再帰関係を解決する方法は、次の 5 つの手順を踏むことだと思います。
1) 次の形式の特性方程式を作成します。
x^k - c[1]*x^k-1 - c[2]*x^k-2 - ... - c[k-1]*x - c[k] = 0
同次再帰関係に再帰インスタンスが 2 つしかない場合は、方程式を次の二次方程式に変更するだけで済みます。
x^2 - a*x - b = 0
という形の再帰関係があるからです。
r(n) = a*r(n-1) + b*r(n-2)
のように書き直せる.
r(n) - a*r(n-1) - b*r(n-2) = 0
2) 再帰関係を特性方程式に書き直したら、次に特性方程式の根 (x[1] と x[2]) を求めます。
3) あなたのルーツにより、解決策は次の 2 つの形式のいずれかになります。
if x[1]!=x[2]
c[1]*x[1]^n + c[2]*x[2]^n
else
c[1]*x[1]^n + n*c[2]*x[2]^n
n>2 の場合。4) 再帰解の新しい形式では、初期条件(r(1) と r(2)) を使用して c[1] と c[2] を見つけます。
あなたの例を使用すると、次のようになります。
1) r(n) = 1*r(n-1) + 2*r(n-2) => x^2 - x - 2 = 0
2) x を解く
x = (-1 +- sqrt(-1^2 - 4(1)(-2)))/2(1)
x[1] = ((-1 + 3)/2) = 1
x[2] = ((-1 - 3)/2) = -2
3) x[1] != x[2] であるため、ソリューションは次の形式になります。
c[1](x[1])^n + c[2](x[2])^n
4) ここで、初期条件を使用して 2 つの定数 c[1] と c[2] を見つけます。
c[1](1)^1 + c[2](-2)^1 = 1
c[1](1)^2 + c[2](-2)^2 = 1
正直なところ、この状況であなたの定数が何であるかわかりません。私はこの時点でやめました。c[1] と c[2] の両方の値がこれら 2 つの式を満たす値になるまで、数値をプラグインする必要があると思います。それか、C が等しい行列 C で行削減を実行します。
[ 1 1 | 1 ]
[ 1 2 | 1 ]
ザカリー:
次のプログラム フラグメントの加算演算の数を最適な方法で記述する再帰 (l == 1 および r == n で呼び出した場合)
int example(A, int l, int r) {
if (l == r)
return 2;
return (A[l] + example(A, l+1, r);
}
r>l の場合の指定されたコードの時間計算量の値は次のとおりです。
int example(A, int l, int r) { => T(r) = 0
if (l == r) => T(r) = 1
return 2; => T(r) = 1
return (A[l] + example(A, l+1, r); => T(r) = 1 + T(r-(l+1))
}
Total: T(r) = 3 + T(r-(l+1))
それ以外の場合、r==l の場合、T(r) = 2 です。これは、if ステートメントと return の両方が実行ごとに 1 ステップを必要とするためです。