卡特蘭(Catalan)數入門詳解
基本概念
介紹
學卡特蘭數我覺得可能比組合數要難一點,因為組合數可以很明確的告訴你那個公式是在幹什麼,而卡特蘭數卻像是在用大量例子來解釋什麼時卡特蘭數
這裡,我對卡特蘭數做一點自己的理解
卡特蘭數是一個在組合數學裡經常出現的一個數列,它並沒有一個具體的意義,卻是一個十分常見的數學規律
對卡特蘭數的初步理解:有一些操作,這些操作有著一定的限制,如一種運算元不能超過另外一種運算元,或者兩種操作不能有交集等,這些操作的合法操作順序的數量
為了區分組合數,這裡用fn表示卡特蘭數的第n項
從零開始,卡特蘭數的前幾項為
1
,
1
,
2
,
5
,
14
,
42
,
132
,
429
,
1430
,
4862
,
16796
,
58786
,
208012
,
742900
,
2674440
,
9694845
,
35357670
,
129644790
…
1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790…
1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790…
定義
遞迴定義
f n = f 0 ∗ f n − 1 + f 1 ∗ f n − 2 + … + f n − 1 f 0 fn=f0∗fn−1+f1∗fn−2+…+fn−1f0 fn=f0∗fn−1+f1∗fn−2+…+fn−1f0,其中 n ≥ 2 n≥2 n≥2
遞推關係
f n = 4 n − 2 n + 1 f n − 1 f_n=4n−2n+1fn−1 fn=4n−2n+1fn−1
通項公式
f n = 1 n + 1 C n 2 n fn=1n+1Cn2n fn=1n+1Cn2n
經化簡後可得
f n = C n 2 n − C n − 12 n fn=Cn2n−Cn−12n fn=Cn2n−Cn−12n
只要我們在解決問題時得到了上面的一個關係,那麼你就已經解決了這個問題,因為他們都是卡特蘭數列
實際問題
先用一個最經典的問題來幫助理解卡特蘭數
去掉了所有的掩飾,將問題直接寫出來就是
例題1
在一個w×h的網格上,你最開始在(0,0)上,你每個單位時間可以向上走一格,或者向右走一格,在任意一個時刻,你往右走的次數都不能少於往上走的次數,問走到(n,m),0≤n有多少種不同的合法路徑。
合法路徑個數為Cn2n−Cn−12n
直接求不好,考慮求有多少種不合法路徑
路徑總數為在2n次移動中選n次向上移動,即Cn2n
畫一下圖,我們把y=x+1這條線畫出來,發現所有的合法路徑都是不能碰到這條線的,碰到即說明是一條不合法路徑
先隨便畫一條碰到這條線的不合法路徑,所有的不合法路徑都會與這條線有至少一個交點,我們把第一個交點設為(a,a+1)
如圖
我們把
(
a
,
a
+
1
)
(a,a+1)
(a,a+1)之後的路徑全部按照
y
=
x
+
1
y=x+1
y=x+1這條線對稱過去
這樣,最後的終點就會變成
(
n
−
1
,
n
+
1
)
(n−1,n+1)
(n−1,n+1)
由於所有的不合法路徑一定會與
y
=
x
+
1
y=x+1
y=x+1有這麼一個交點
我們可以得出,所有不合法路徑對稱後都唯一對應著一條到
(
n
−
1
,
n
+
1
)
(n−1,n+1)
(n−1,n+1)的路徑
且所有到
(
n
−
1
,
n
+
1
)
(n−1,n+1)
(n−1,n+1)的一條路徑都唯一對應著一條不合法路徑(只需將其對稱回去即可)
所以不合法路徑總數是
C
n
−
12
n
Cn−12n
Cn−12n
那麼合法的路徑總數為 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2n−Cn−12n
這是一個非常好用且重要的一個方法,其它的問題也可以用該方法解決
即找到不合法路徑唯一對應的到另一個點的路徑
如網格計數
01序列
你現在有n個0和n個1,問有多少個長度為2n的序列,使得序列的任意一個字首中1的個數都大於等於0的個數
例如n=2時
有
1100
,
1010
1100,1010
1100,1010兩種合法序列
而
1001
,
0101
,
0110
,
0011
1001,0101,0110,0011
1001,0101,0110,0011都是不合法的序列
合法的序列個數為 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2n−Cn−12n
我們把出現一個1看做向右走一格,出現一個1看做向上走一格,那麼這個問題就和上面的例題1一模一樣了
擴充
如果是
n
個
1
,
m
個
0
n個1,m個0
n個1,m個0呢?
不過是最後的終點變為了
(
n
,
m
)
(n,m)
(n,m)罷了
如果是1的個數不能夠比m少k呢
我們只需將
y
=
x
+
1
y=x+1
y=x+1這條線上下移動即可
括號匹配
你有n個左括號,n個右括號,問有多少個長度為2n的括號序列使得所有的括號都是合法的
合法的序列個數為 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2n−Cn−12n
要使所有的括號合法,實際上就是在每一個字首中左括號的數量都不少於右括號的數量
將左括號看做1,右括號看做0,這題又和上面那題一模一樣了
進出棧問題
有一個棧,我們有2n次操作,n次進棧,n次出棧,問有多少中合法的進出棧序列
合法的序列個數為 C n 2 n − C n − 12 n Cn2n−Cn−12n Cn2n−Cn−12n
要使序列合法,在任何一個字首中進棧次數都不能少於出棧次數…
後面就不用我說了吧,和上面的問題又是一模一樣的了
312排列
一個長度為n的排列a,只要滿足
i
<
j
<
k
i<j<k
i<j<k且
a
j
<
a
k
<
a
i
aj<ak<ai
aj<ak<ai就稱這個排列為312排列
求n的全排列中不是312排列的排列個數
答案也是卡特蘭數
我們考慮312排列有什麼樣的特徵
如果考慮一個排列能否被1,2,3,…,n−1,n排列用進棧出棧來表示
那麼312排列就是所有不能被表示出來的排列
那麼這個問題就被轉化成進出棧問題了
不相交弦問題
在一個圓周上分佈著 2n個點,兩兩配對,並在這兩個點之間連一條弦,要求所得的2n條弦彼此不相交的配對方案數
當n=4時,一種合法的配對方案為如圖
合法的序列個數為Cn2n−Cn−12n
這個問題沒有上面的問題那麼顯然,我們規定一個點為初始點,然後規定一個方向為正方向
如規定最上面那個點為初始點,逆時針方向為正方向
然後我們把一個匹配第一次遇到的點(稱為起點)旁邊寫一個左括號(,一個匹配第二次遇到的點(稱為終點)旁邊寫一個右括號)
如圖
看出來嗎,在規定了這樣的一個順序後,在任意一個字首中起點的個數都不能少於終點的個數
於是這又是一個卡特蘭數列了
二叉樹的構成問題
有n個點,問用這n個點最終能構成多少二叉樹
答案仍然是卡特蘭數列
這個問題不是用上面的方法,是用遞迴定義的卡特蘭數
一個二叉樹分為根節點,左子樹,右子樹
其中左子樹和右子樹也是二叉樹,左右子樹節點個數加起來等於n−1
設i個點能構成fi個二叉樹
我們列舉左子樹有幾個點可得
f
n
=
f
0
∗
f
n
−
1
+
f
1
∗
f
n
−
2
+
…
+
f
n
−
1
∗
f
0
fn=f0∗fn−1+f1∗fn−2+…+fn−1∗f0
fn=f0∗fn−1+f1∗fn−2+…+fn−1∗f0
這個和卡特蘭數列的遞迴定義是一模一樣的
凸多邊形的三角劃分
一個凸的n邊形,用直線連線他的兩個頂點使之分成多個三角形,每條直線不能相交,問一共有多少種劃分方案
答案還是卡特蘭數列
我們在凸多邊形中隨便挑兩個頂點連一條邊,這個凸多邊形就會被分成兩個小凸多邊形,由於每條直線不能相交,接下來我們就只要求這兩個小凸多邊形的劃分方案然後乘起來即可
和二叉樹的構成問題一樣,我們列舉大凸多邊形被分成的兩個小凸多邊形的大小即可
階梯的矩形劃分
一個階梯可以被若干個矩形拼出來
圖示是兩種劃分方式
像下圖是不合法的劃分方式
問,一個n階矩形有多少種矩形劃分
答案仍然是卡特蘭數列
我們考慮階梯的每個角
如圖
每個角一定是屬於不同的矩形的,我們考慮和左下角屬於一個矩形的是哪個角
這個矩形將這個梯形又分成兩個小梯形,如圖
於是我們又可以寫出遞推式了
和卡特蘭數列的遞迴式是一樣的…
相關文章
- 卡特蘭數和斯特林數
- 【數學】組合數學 - 卡特蘭數
- Catalan 數
- P3200-[HNOI2009]有趣的數列【卡特蘭數】
- 卡特蘭數關於凸多邊形的證明
- 卡特蘭數 洛谷P1641 [SCOI2010]生成字串字串
- 詳解HDFS入門
- lambda 的入門詳解
- Anaconda 使用入門詳解
- JVM入門(JVM引數詳解和常用命令)JVM
- Solon詳解(一)- 快速入門
- Redis入門--進階詳解Redis
- Spring入門之IOC詳解Spring
- Logback 快速入門 / 使用詳解
- Flutter 入門 — Container 屬性詳解FlutterAI
- Vue入門—事件與方法詳解Vue事件
- 詳解安卓架構入門安卓架構
- spring-boot入門程式詳解Springboot
- Go 中的 gRPC 入門詳解GoRPC
- 詳解前端HTTP協議入門教程前端HTTP協議
- Next.js 入門超詳解教程JS
- 樹莓派入門操作流程詳解樹莓派
- Springboot mini - Solon詳解(一)- 快速入門Spring Boot
- 什麼是 Catalan 數列以及其應用
- (詳細圖解) 逆波蘭表示式圖解
- 專題一之Spring Boot入門詳解Spring Boot
- Jmeter(三十四) - 從入門到精通進階篇 - 引數化(詳解教程)JMeter
- 新手入門,webpack入門詳細教程Web
- [MySQL光速入門]016 圖解變數MySql圖解變數
- webpack4.x最詳細入門講解Web
- gitbook 入門教程之常用命令詳解Git
- Springboot是什麼?Springboot詳解!入門介紹Spring Boot
- Python入門小專案-氣泡排序詳解Python排序
- Jaeger Client Go 鏈路追蹤|入門詳解clientGo
- Python程式設計入門基礎語法詳解Python程式設計
- Java反射詳解:入門+使用+原理+應用場景Java反射
- yarn詳細入門教程Yarn
- ECMAScript 6入門 - 變數的解構賦值變數賦值