Try   HackMD

【資工考研】離散:遞迴關係式與其求解

Recurrence Relation

考慮數列

a0,a1,,an ,如果
an
可以用之前的若干項表示,則稱此種表達式為遞迴關係式

用數學歸納法證明

通常是題目給定了遞迴關係式,我們要證明該通解是正確的

例如知名的 Ackerman's function:

{Ack(0,n)=n+1Ack(m,0)=Ack(m1,1),m>0Ack(m,n)=Ack(m1,Ack(m,n1)),m,n>0

Show

nN,Ack(1,n)=n+2.

Sol:

n=0 時,
Ack(1,0)=Ack(0,1)=1+1=2=0+2
,原式成立
n=k0
時原式成立
n=k+1
時,
Ack(1,k+1)=Ack(0,Ack(1,k))=Ack(0,k+2)=k+3=(k+1)+2
原式亦成立
故由數學歸納法知,
nN,Ack(1,n)=n+2


Suppose that

am,n is defined recursively by
am,n={0 if n=0,m=0am1,n+1 if n=0,m>0am,n1+n if n>0
. Show that
am,n=m+n(n+1)/2,(m,n)N×N
.

Sol:

N×N 中所有有序對依字典順序排序,而對
(m,n)
做歸納
(m,n)=(0,0)
時,
am,n=a0,0=0=0+0(0+1)/2
,原式成立

假設排在

(m,n) 前的有序對皆使題目敘述成立
則對
(m,n)
, 如果
n=0
則因為
(m1,n)
排在
(m,n)
前,故
am,n=am1,n+1=m1+n(n+1)/2+1=m+n(n+1)/2

n>0
則因為
(m,n1)
排在
(m,n)
前,故
am,n=am,n1+n=m+(n1)n/2+n=m+n(n+1)/2

故由數學歸納法知,

am,n=m+n(n+1)/2,(m,n)N×N

代入求解大法

由規律性來求出整體通解,在解遞迴演算法的時間複雜度時,是相當常用的技巧

通常代個幾項就能看出規律了

例如:

T(n)=2T(n1)+1,
T(1)=1

Sol:

T(n)=2(2T(n2)+1)+1=22T(n2)+2+1=2n1T(1)+2n2++2+1=2n1+2n11=θ(2n)

T(n)=2T(n2)+n,
T(1)=0

Sol:

T(n)=22T(n22)+2n=2kT(n2k)+kn

Let

n=2k,k=lgn

T(n)=nlgn=θ(nlgn)

特徵多項式

齊次 + 相異特徵根

若有

α1,αr 為相異特徵根,則通解
an=c1α1n++crαrn

例如:

an=2an1+3n2,n2,
a0=1,a1=1

特徵式:

α22α3=0,
α=3
or
1

Let

an=c13n+c2(1)n

{a0=c1+c2=1a1=3c1c2=1

c1=12,c2=12

an=12[3n+(1)n],n0

齊次 + 有重根

假設

α1 解出有
m1
個,那就要修正成
c1α1n+c2nα1n+cm1nm11α1n

這是為了防止同類項合併

例如:

an6an1+9an2=0,n2,
a0=5,a1=12

解出特徵根:

3,3

Let

an=c13n+c2n3n

{a0=c1=5a1=3c1+3c2=12

c1=5,c2=1

an=53nn3n,n0

齊次 + 複數根

如果解出複數根如

α±βi ,則令
an=ρn(B1cosθ+B2sinθ)
,其中
ρ=α2+β2
cosθ=αρ,sinθ=βρ

例如:

an+2an1+2an2=0,n2,
a0=a1=1

解出特徵根為

1±i

Let

an=(2)n(B1cos3nπ4+B2sin3nπ4)

{a0=B1=1a1=2(B12+B22)=1

B1=1,B2=2

an=(2)n(cos3nπ4+2sin3nπ4),n0

k
階常係數線性非齊次

如果題目是長

an+c1an1+ckank=f(n),ck0

則通解

an=an(h)+an(p) ,其中
an(h)
叫齊次解、
an(p)
為特殊解

an(h) 就是我們不看
f(n)
把原式當齊次式,用上面的方法解出來的解
an(p)
則要看
f(n)
的長相,求出
an(p)
的模樣後代回原式以解出其係數

f(n)
長相
an(p)
修正之注意事項
t
次多項式
d0+d1n+dtnt
若有
s
個特徵根為
1
,修正為
(d0+d1n+dtnt)ns
b
為底的指數
d0bn
若有
s
個特徵根為
b
,修正為
(d0bn)ns
三角函數
d0cosnθ+d1sinnθ
上述情況之線性組合 上述之線性組合 (遵照上面)

這邊的修正也是防止同類項合併

例如:

an=4an13an2+4,n3,
a1=9,a2=5

特徵根求出為

1,3

齊次解令為

an(h)=c11n+c23n
特殊解令為
an(p)=d0n
(因為特徵根有
1
) ,代回原式:

d0n4d0(n1)+3d0(n2)=4,d0=2

an=c11n+c23n2n

{a1=c1+3c22=9a2=c1+9c24=5

c1=10,c2=1

an=10+3n2n,n1


an=an1+2an2+(1)n,n2,
a0=a1=1

特徵根為

2,1

an(p)=d0(1)nn (因為有特徵根與
f(n)
之底數相同)

d0 代回原式求出是
13

an=c12n+c2(1)n+13n(1)n

解出

c1=79,c2=29

生成函數

常見的一般生成函數要熟悉,例如

11x=i=0xi,|x|<1

(1+x)n=r=0(nr)xr=r=0(1)r(n+r1r)xr

一般來說,用生成函數解很佔計算空間,通常都是題目要求你要用生成函數解題才用,不然就用其他方法快速解
用生成函數算可能會出包,所以建議先用特徵方程之類的方法求出答案,再用生成函數寫計算過程,最後看看有沒有計算錯誤

例如:

an+28an+1+15an=0,n0,
a0=1,a1=6

我們先偷算答案到底是多少

首先不難看出特徵根是

3,5

{a0=c1+c2=1a1=3c1+5c2=6

所以我們搶先算出了

an=12(3n+35n),n0
我們這樣只需要花幾秒鐘

接著才是用生成函數開始計算,首先我們要把原式變成

n=?anxn 的模樣

原式是

an+28an+1+15an=0
所以寫成
n=0an+2xn8n=0an+1xn+15n=0anxn=0

可以看到係數的部分還沒都是

an,接著我們要對
的 index 動手腳 使得每個係數都能寫成
an
的模樣:

n=0an+2xn8n=0an+1xn+15n=0anxn=0n=2anxn8n=2an1xn+15n=2an2xn=0n=2anxn8xn=1anxn+15x2n=0anxn=0(18x+15x2)n=0anxn(a0x0+a1x1)(8xa0x0)=0n=0anxn=(12x)(18x+15x2)=1213x+3215x (把 a0 跟 a1 的值代入,轉成熟悉的生成函數)n=0anxn=12[i=0(3x)i+3i=0(5x)i]

比對等號左右兩邊的係數,便可得

an=12(3n+35n),n0
回去看一下事先算好的答案,我們算對了

可以看到,生成函數的算法很考驗你的細心,還有熟不熟悉生成函數
基本上是建議可以直接把原式寫成

an8an1+15an2=0
然後就能跳到上面計算過程的第二步:
n=2anxn8n=2an1xn+15n=2an2xn=0

省一步思考的功夫,其實會輕鬆一點


n 個自然數
1,2,,n
排列使得
k
不在第
k
位 (亂序排列, Derangement) ,令其方法數為
Dn

(1)

Dn=(n1)(Dn1+Dn2),n3,
D1=0,D2=1

考慮任一數

i (
1in
) 放置到位置
j
(
ij
)
Dn
可以分成兩種情況:

  1. j
    放到位置
    i
  2. j
    不放到位置
    i

以 1. 來說,代表我們只需要考慮剩下

n2 個數的亂序方法數,即
Dn2

至於 2. 的情況,我們就需要考慮
n1
個數亂序的方法數,即
Dn1

而對於數字

i 總共有
n1
j
可以選擇,故
Dn=(n1)(Dn1+Dn2),n3

只有一個數字沒得亂序,故

D1=0 ;兩個數字之亂序只會是兩數交換位置,故
D2=1

(2)

Let

f(x)=n=0Dnxnn!, then
f(x)=ex1x

根據

Dn=(n1)(Dn1+Dn2)
DnnDn1=(1)[Dn1(n1)Dn2]=(1)n2(D22D1)=(1)n2=(1)n

(用代入大法)

接著我們對上式使用生成函數法解題:

DnnDn1=(1)n

n=1Dnn!xnnn=1Dn1n!xn=n=1(1)nn!xnn=1Dnn!xnxn=0Dnn!xn=n=1(1)nn!xn(f(x)D0)xf(x)=ex1f(x)=ex1+D01x=ex1x

(3)

Dn 通解?

f(x)=n=0Dnxnn!=ex1x=(1x1!+x22!x33!+)(1+x+x2+x3+)=n=0(111!+12!13!++(1)nn!)xnDn=n!(111!+12!13!++(1)nn!)

應用問題

  1. The Tower of Hanoi (
    an=2n1
    for 3-tower)
  2. 含偶數個
    0
    的字串
  3. 0
    的字串

字串型的問題,其實就是討論子字串開頭會是誰,進而構建出遞迴關係式
剩下就簡單了

子字串從原始字串開始討論

雖然看似純幹話,但遞迴應用問題基本上你想辦法構建出遞迴關係式,答案便呼之欲出了
通常就是你總覺得這問題有個模式可以重複遵循

解演算法的 DP 也是這樣子想出遞迴關係式的

Catalan Number

我們很多東西的答案是 Catalan number ,例如

n 節點的相異 binary tree 有
Cn
種,即第
n
個 Catalan number

我在LeetCode 96. Unique Binary Search Trees 有講過要怎麼想出遞迴關係式,不過我沒有說明 Catalan number 怎麼從遞迴關係式解出通解

其實呢,我們可以生成函數來解
這邊留給讀者思考怎麼求

至於各種姿勢的 Catalan number 證法可以參考wiki

Fibonacci Number

費氏數,老朋友了吧,用特徵函數能求出

Fn=15((1+52)n(152)n)
這數字應該要很熟悉了

其中

1+52 就是大名鼎鼎的黃金比例 (
φ
)

φn=Fn1+φFn

有些題目呢,看起來無關但其實就是費氏數
例如著名的爬樓梯問題(LeetCode 上有一題,你可以點開此連結來寫)

You are climbing a staircase. It takes

n steps to reach the top.

Each time you can either climb

1 or
2
steps. In how many distinct ways can you climb to the top?

設有

an 種走法
分兩種情況討論:

  1. 第一步走
    1
    階樓梯:有
    an1
    種方式
  2. 第二步走
    2
    階樓梯:有
    an2
    種方式

an=an1+an2,n3,
a1=1,a2=2

這不就老朋友嗎?
剩下不用我解了吧