9-17_算法实验报告
斐波那契数列
已知:
f
(
n
)
=
{
f
(
n
−
1
)
+
f
(
n
−
2
)
;
(
n
>
2
)
1
;
(
n
=
1
,
n
=
2
)
f(n) = \begin{cases}f(n-1) + f(n - 2);(n > 2)\\ 1;(n = 1, n = 2)\end{cases}
f(n)={f(n−1)+f(n−2);(n>2)1;(n=1,n=2)
请使用 生成函数法 求该函数的时间复杂度。
解答
对于斐波那契数列,已知:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
;
(
n
>
2
)
f(n) = f(n - 1) + f(n-2);(n > 2)
f(n)=f(n−1)+f(n−2);(n>2)
构造一个函数为:
G
(
x
)
=
f
(
1
)
x
+
f
(
2
)
x
2
+
.
.
.
+
f
(
n
)
x
n
+
.
.
.
G(x) = f(1)x + f(2)x^2 + ... + f(n)x^n+ ...
G(x)=f(1)x+f(2)x2+...+f(n)xn+...
则有:
G
(
x
)
−
x
G
(
x
)
−
x
2
G
(
x
)
=
f
(
1
)
x
+
f
(
2
)
x
2
+
.
.
.
+
−
f
(
1
)
x
2
−
f
(
2
)
x
3
−
.
.
.
−
−
f
(
1
)
x
3
−
f
(
2
)
x
4
−
.
.
.
−
G(x) - x G(x) - x^2G(x) = f(1)x + f(2)x^2 + ...+ \\ - f(1)x^2 - f(2)x^3 - ... - \\ - f(1)x^3 - f(2)x^4 - ... - \\
G(x)−xG(x)−x2G(x)=f(1)x+f(2)x2+...+−f(1)x2−f(2)x3−...−−f(1)x3−f(2)x4−...−
整理之后可得:
G
(
x
)
−
x
G
(
x
)
−
x
2
G
(
x
)
=
f
(
1
)
x
+
(
f
(
2
)
−
f
(
1
)
)
x
2
+
(
f
(
3
)
−
f
(
2
)
−
f
(
1
)
)
x
3
+
.
.
.
+
G(x) - x G(x) - x^2G(x) = f(1)x + (f(2)-f(1))x^2 + (f(3)-f(2)-f(1))x^3 + ... +
G(x)−xG(x)−x2G(x)=f(1)x+(f(2)−f(1))x2+(f(3)−f(2)−f(1))x3+...+
则:
G
(
x
)
−
x
G
(
x
)
−
x
2
G
(
x
)
=
x
G(x) - x G(x) - x^2G(x) = x
G(x)−xG(x)−x2G(x)=x
G ( x ) = x 1 − x − x 2 G(x) = \frac{x}{1-x-x^2} G(x)=1−x−x2x
通过待定系数法,拆分为:
G
(
x
)
=
a
1
−
r
x
+
b
1
−
s
x
G
(
x
)
=
a
(
1
−
s
x
)
+
b
(
1
−
r
x
)
(
1
−
r
x
)
(
1
−
s
x
)
=
(
a
+
b
)
−
(
a
s
+
b
r
)
x
1
−
(
r
+
s
)
x
+
r
s
x
2
G(x) = \frac{a}{1-rx} + \frac{b}{1-sx}\\ G(x) = \frac{a(1-sx) + b(1-rx)}{(1-rx)(1-sx)} = \frac{(a + b) - (as+br)x}{1-(r+s)x+rsx^2}
G(x)=1−rxa+1−sxbG(x)=(1−rx)(1−sx)a(1−sx)+b(1−rx)=1−(r+s)x+rsx2(a+b)−(as+br)x
已知:
x
1
−
x
−
x
2
=
(
a
+
b
)
−
(
a
s
+
b
r
)
x
1
−
(
r
+
s
)
x
+
r
s
x
2
\frac{x}{1-x-x^2}= \frac{(a + b) - (as+br)x}{1-(r+s)x+rsx^2}
1−x−x2x=1−(r+s)x+rsx2(a+b)−(as+br)x
则可列出四元方程组:
{
a
+
b
=
0
a
s
+
b
s
=
−
1
r
+
s
=
1
r
s
=
−
1
{
a
=
1
5
b
=
−
1
5
r
=
1
+
5
2
s
=
1
−
5
2
\begin{cases} a+b = 0\\ as + bs = -1\\ r+s = 1\\ rs = -1 \end{cases} \\ \begin{cases} a = \frac{1}{\sqrt{5}}\\ b = - \frac{1}{\sqrt{5}}\\ r = \frac{1+\sqrt{5}}{2}\\ s = \frac{1-\sqrt{5}}{2} \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧a+b=0as+bs=−1r+s=1rs=−1⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a=51b=−51r=21+5s=21−5
故利用泰勒公式:
G
(
x
)
=
a
1
−
r
x
+
b
1
−
s
x
=
a
(
1
+
r
x
+
r
2
x
2
+
.
.
.
)
+
b
(
1
+
s
x
+
s
2
x
2
+
.
.
.
)
G(x) = \frac{a}{1-rx} + \frac{b}{1-sx}\\ = a(1+rx+r^2x^2+...) + b(1+sx+s^2x^2+...)
G(x)=1−rxa+1−sxb=a(1+rx+r2x2+...)+b(1+sx+s2x2+...)
展开整理后得:
G
(
x
)
=
(
a
+
b
)
+
(
a
r
+
b
s
)
x
+
(
a
r
2
+
b
s
2
)
x
2
+
.
.
.
+
(
a
r
n
+
b
s
n
)
x
n
+
.
.
.
G(x) = (a + b) + (ar+bs)x+(ar^2+bs^2)x^2 + ... + (ar^n + bs^n)x^n + ...
G(x)=(a+b)+(ar+bs)x+(ar2+bs2)x2+...+(arn+bsn)xn+...
和一开始构造函数相比:
G
(
x
)
=
f
(
1
)
x
+
f
(
2
)
x
2
+
.
.
.
+
f
(
n
)
x
n
+
.
.
.
G(x) = f(1)x + f(2)x^2 + ... + f(n)x^n+ ...
G(x)=f(1)x+f(2)x2+...+f(n)xn+...
可得 f(n) 即为:
f
(
n
)
=
a
r
n
+
b
s
n
=
1
5
[
(
1
+
5
2
)
n
−
1
−
5
2
)
n
]
f(n) = ar^n+ bs^n = \frac{1}{\sqrt{5}}[(\frac{1+\sqrt{5}}{2})^n - \frac{1-\sqrt{5}}{2})^n]
f(n)=arn+bsn=51[(21+5)n−21−5)n]
所以最终结果为:
f
(
n
)
=
1
5
[
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
]
f(n) = \frac{1}{\sqrt{5}}[(\frac{1+\sqrt{5}}{2})^n - (\frac{1-\sqrt{5}}{2})^n]
f(n)=51[(21+5)n−(21−5)n]
由此得 f(n) 为幂级数的差,时间复杂度为 O(n)