卡特蘭數(Catalan Number)

卡特蘭數又稱卡塔蘭數,英文名Catalan number,是組合數學中一個常出如今各類計數問題中出現的數列。該數在計算機專業中比較重要,有一些具體的應用實例。這篇文章主要分三部分:php

  1. 卡特蘭數遞歸式的含義解釋
  2. 卡特蘭數表達式的證實過程
  3. 卡特蘭數的計算機中的應用

Catalan Number遞歸式解釋

假設h(0)=1,h(1)=1,catalan數知足遞推式:
\[ h(n) = h(0)*h(n-1) + h(1)*h(n-2) + h(2)*h(n-3) + ... +h(n-1)*h(0) \tag{1.1} \]
遞歸式背後有什麼物理含義呢,這裏以出棧序列問題進行說明:編程

問題描述:一個棧(無窮大)的進棧序列爲1,2,3,…,n,有多少個不一樣的出棧序列?spa

含義解釋:首先,咱們設\(h(n)\)=序列個數爲n的出棧序列種數。(咱們假定,最後出棧的元素爲k,顯然,k取不一樣值時的狀況是相互獨立的,也就是求出每種k最後出棧的狀況數後可用加法原則,因爲k最後出棧,所以,在k入棧以前,比k小的值均出棧,此處狀況有\(h(k-1)\)種,而以後比k大的值入棧,且都在k以前出棧,所以有\(h(n-k)\)種方式,因爲比k小和比k大的值入棧出棧狀況是相互獨立的,此處可用乘法原則,\(h(n-k)*h(k-1)\)種,求和即是Catalan遞歸式。.net

Catalan Number表達式證實

第n個卡特蘭數h(n)表達式以下
\[ h(n)=\frac{C_{2n}^{n}}{n+1}=C_{2n}^{n}-C_{2n}^{n-1} \tag{1.2} \]
具體證實過程以下code

爲了便於編程實現,須要進一步推導h(n)與h(n-1)之間的關係blog

已知\(h(n)\),易知
\[ h(n-1)=\frac{C_{2n-2}^{n-1}}{n} \]
推導\(h(n)\)\(C_{2n}^{n}\)\(h(n-1)\)\(C_{2n-2}^{n-1}\)之間的關係,由\(kC_{n}^{k}=nC_{n-1}^{k-1}\)
\[ \begin{align} n*C_{2n}^{n}&=2nC_{2n-1}^{n-1} \\ C_{2n}^{n}&=2C_{2n-1}^{n-1} \\ C_{2n}^{n}&=2\frac{(2n-1)C_{2n-2}^{n-1}}{n} \\ C_{2n}^{n}&=2(2n-1)h(n-1) \\ \frac{C_{2n}^{n}}{n+1}&=\frac{2(2n-1)}{n+1}h(n-1) \\ h(n)&=\frac{2(2n-1)}{n+1}h(n-1) \end{align} \]
最終獲得\(h(n)\)\(h(n-1)\)之間的遞歸式\(h(n)=\frac{2(2n-1)}{n+1}h(n-1)\)遞歸

Catalan Number應用實例

括號匹配問題

問題描述: 矩陣連乘 \(P=A_1A_2...A_n\),依據乘法結合律,不改變其順序,只用括號表示成對的乘積,問有幾種括號化的方案?leetcode

問題轉換一下就是n對括號的正確匹配方案,能夠作一下LeetCode-22get

出棧次序問題

問題描述: 一個棧(無窮大)的進棧序列爲1,2,3,..n,有多少個不一樣的出棧序列?數學

出棧問題問題正是卡特蘭數遞歸式\(h(n)=h(0)h(n-1)+h(1)h(n-2)+...+h(n-1)h(0)\)的由來

相關應用問題

  1. 有2n我的排成一行進入劇場,入場費5元。其中只有n我的有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視做將5元入棧,持10元者到達視做使棧中某5元出棧)

  2. n個1和n個0組成一個2n位的二進制數,要求從左到右掃描,0的累計數不小於1的累計數,求知足條件的的數。

  3. 12我的排成兩排,每排必須是從矮到高排列,並且第二排比對應的第一排的人高,問排列方式有多少種?

    咱們先把這12我的從低到高排列,而後,選擇6我的排在第一排,那麼剩下的6個確定是在第二排。對問題進行轉化:用0表示對應的人在第一排,用1表示對應的人在第二排,那麼含有6個0,6個1的序列,而且任意前綴中0的個數大於等於1的個數就對應一種方案,轉化後的問題就是問題2了。

  4. 給定節點組成二叉樹的問題:給定n個節點,能構成多少種形狀不一樣的二叉樹?

    先取一個點做爲頂點,而後左邊依次能夠取0至n-1個相對應的,右邊是n-1到0個,兩兩配對相乘,就是\(h(0)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(0)=h(n)\)能構成\(h(n)\)個,所以二叉樹問題也能夠解釋卡特蘭數遞歸式(1.1)式的由來

  5. n*n棋盤從左下角走到右上角而不穿過主對角線的走法?

    要從左下角走到右上角則必須向上走n步,向右n步,同時爲了避免跨過主對角線,則走過的步數中向上走的步數必須大於等於向右走的步數,剖析以後發現這個問題與問題3是等價問題,走法有卡特蘭數\(h(n)\)種。

    能夠作一下下面兩題練練手:

    hdoj2067-小兔的棋盤

    LeetCode62-Unique Paths

  6. n個+1和n個-1構成的2n項序列,其部分和總知足:\(a_1+a_2+...+a_n>=0\)的序列的個數。

    卡特蘭數表達式(1.2)式就是以該問題模型爲基礎推導出來的

參考連接:

  1. https://blog.csdn.net/ACdreamers/article/details/7628667
相關文章
相關標籤/搜索