卡特蘭數——括號匹配問題
阿新 • • 發佈:2019-01-22
卡特蘭數的遞推公式是F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}
一般性公式為F(n)=C(2n,n)/(n+1)
可以描述的問題有
1、n個元素的二叉查詢樹有多少種。
2、n*n棋盤從左下角走到右上角而不穿過主對角線的走法。
3、2n個人排隊買票問題,票價50,n個人拿50元,n個人拿100元,售票處無零錢,能順利賣票的所有排隊方式。
4、n個元素全部入棧並且全部出棧的所有可能順序。
這些問題的答案都是卡特蘭數F(n)。但是很明顯可以看出後三個問題是同質的。
都可以抽象成2n個操作組成的操作鏈,其中A操作和B操作各n個,且要求截斷到操作鏈的任何位置都有:A操作(向右走一步、收到50元、元素入棧)的個數不少於B操作(向上走一步、收到100元找出50元、元素出棧)的個數。故問題2、3、4其實是同一個問題。
下面先證明問題2、3、4和問題1同解,再證明問題2、3、4的解是F(n)=C(2n,n)/(n+1),從而證明問題1的解也是F(n)=C(2n,n)/(n+1)。
1、問題2、3、4和問題1同解
問題1的解是F(n)=∑(k=0…n-1){F(k)*F(n-1-k)},因為一棵n個結點的二叉排序樹的根可以是1到n的任意結點,設為k,則其左子樹結點個數為k,左子樹的種類一共有F(k-1)種,右子樹結點個數為n-k,右子樹的種類一共有F(n-k)。而究竟哪一點為根可以有1到n共n個選擇,故k取遍1到n——F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}。
如果我們能證明問題2的解也可表示為F(n)=∑(k=0…n-1){F(k)*F(n-1-k)},就完成了證明。
考慮n*n棋盤,記主對角線為L。從左下角走到右上角不穿過對角線L的所有路徑,不算起點,一定有第一次接觸到L的位置(可能是終點),設此位置為M,座標為(x,x)——設第一個數為橫軸座標。該路徑一定從下方的(x,x-1)而來,而起點處第一步也一定是走向(1,0),兩者理由相同——否則就穿過了主對角線。考慮從(1,0)到(x,x-1)的(x-1)*(x-1)的小棋盤中,因為在此中路徑一直沒有接觸過主對角線(M的選取),所以在此小棋盤中路徑也一定沒有穿過從(1,0)到(x,x-1)的小棋盤的對角線L1。這樣在這個區域中的滿足條件的路徑數量就是一個同構的子問題,解應該是F(x-1),而從M到右上角終點的路徑數量也是一個同構的子問題,解應該是F(n-x),而第一次接觸到主對角線的點可以從(1,1)取到(n,n),這樣就有F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k-1)*F(n-k)}。證畢。
2、問題2的解為F(n)=C(2n,n)/(n+1)
思路是先求所有從(0,0)到(n,n)的路徑數X,再求所有穿過主對角線L的從(0,0)到(n,n)的路徑數Y,用前者減去後者得到所求。
從(0,0)到(n,n)的路徑數顯然是C(2n,n),一共要走2n步到達右上角,其中向右和向上各n步,總走法是C(2n,n)。
考慮一個新增的位置(n-1,n+1),它位於終點的左上角一個格處,設所有從(0,0)到(n-1,n+1)的路徑數為Z,下面要證明Y和Z相等,從而通過求Z來求Y。
考慮從(0,1)到(n-1,n)的對角線L2,對於所有穿過L而到達終點的路徑,一定會接觸到L2,找出某路徑第一次接觸到L2的位置M1,將從M1到終點的路徑沿L2做對摺一定會得到一條從M1到(n-1,n+1)的路徑,故每條穿過L到達終點的路徑都對應一條到達(n-1,n+1)的路徑,即有Y<=Z。
所有從起點到達(n-1,n+1)的路徑都一定會穿過L2,找出某路徑第一次穿過L2的位置M2,將M2到(n-1,n+1)的路徑沿L2對摺,就得到一條M2到(n,n)的路徑,且該條路徑一定穿過L,故每條到達(n-1,n+1)的路徑都對應一條穿過L到達終點的路徑,即有Z<=Y。
故Z==Y。
接下來通過求Z來求Y。Z是顯然的從(0,0)到(n-1,n+1)共需走2n步,其中向右n-1步、向上n+1步,故Z=C(2n,n-1)。
由以上可知F(n)=X-Y=X-Z=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)。證畢。
由以上可知問題1的解也是F(n)=C(2n,n)/(n+1),故求和(k){F(k)*F(n-1-k)}=C(2n,n)/(n+1)。這個數稱為卡特蘭數,前幾項為1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796。
除了上面描述的四個問題外,它對應的問題還有:
矩陣鏈所有乘法順序問題(同問題1)。
凸多邊形剖分成三角形的方法數(同問題1)。
3 Responses to “卡特蘭數”
carter Says:
一月 6th, 2011 at 5:50 下午
請問樓主對括號配對和入棧出棧這2個問題,如何分析成F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}? 並且如何進一步分析成C(2n,n)-C(2n,n-1)?
chris Says:
一月 10th, 2011 at 9:26 上午
這兩個問題與棋盤問題都是同質的,這個很明顯。而棋盤問題實際是可以寫成F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}的,我上面好像忘了寫了,等我下午考完試來補上吧。
chris Says:
一月 10th, 2011 at 4:24 下午
原來我上面已經證明過了。因為入棧出棧問題和括號配對問題與棋盤街問題同質(考慮入棧和一個左括號等於向右走一格,出棧和一個右括號等於向左走一格);而棋盤街問題可以分析成F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}(文中有證明)。
一般性公式為F(n)=C(2n,n)/(n+1)
可以描述的問題有
1、n個元素的二叉查詢樹有多少種。
2、n*n棋盤從左下角走到右上角而不穿過主對角線的走法。
3、2n個人排隊買票問題,票價50,n個人拿50元,n個人拿100元,售票處無零錢,能順利賣票的所有排隊方式。
4、n個元素全部入棧並且全部出棧的所有可能順序。
這些問題的答案都是卡特蘭數F(n)。但是很明顯可以看出後三個問題是同質的。
都可以抽象成2n個操作組成的操作鏈,其中A操作和B操作各n個,且要求截斷到操作鏈的任何位置都有:A操作(向右走一步、收到50元、元素入棧)的個數不少於B操作(向上走一步、收到100元找出50元、元素出棧)的個數。故問題2、3、4其實是同一個問題。
下面先證明問題2、3、4和問題1同解,再證明問題2、3、4的解是F(n)=C(2n,n)/(n+1),從而證明問題1的解也是F(n)=C(2n,n)/(n+1)。
1、問題2、3、4和問題1同解
問題1的解是F(n)=∑(k=0…n-1){F(k)*F(n-1-k)},因為一棵n個結點的二叉排序樹的根可以是1到n的任意結點,設為k,則其左子樹結點個數為k,左子樹的種類一共有F(k-1)種,右子樹結點個數為n-k,右子樹的種類一共有F(n-k)。而究竟哪一點為根可以有1到n共n個選擇,故k取遍1到n——F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}。
如果我們能證明問題2的解也可表示為F(n)=∑(k=0…n-1){F(k)*F(n-1-k)},就完成了證明。
考慮n*n棋盤,記主對角線為L。從左下角走到右上角不穿過對角線L的所有路徑,不算起點,一定有第一次接觸到L的位置(可能是終點),設此位置為M,座標為(x,x)——設第一個數為橫軸座標。該路徑一定從下方的(x,x-1)而來,而起點處第一步也一定是走向(1,0),兩者理由相同——否則就穿過了主對角線。考慮從(1,0)到(x,x-1)的(x-1)*(x-1)的小棋盤中,因為在此中路徑一直沒有接觸過主對角線(M的選取),所以在此小棋盤中路徑也一定沒有穿過從(1,0)到(x,x-1)的小棋盤的對角線L1。這樣在這個區域中的滿足條件的路徑數量就是一個同構的子問題,解應該是F(x-1),而從M到右上角終點的路徑數量也是一個同構的子問題,解應該是F(n-x),而第一次接觸到主對角線的點可以從(1,1)取到(n,n),這樣就有F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k-1)*F(n-k)}。證畢。
2、問題2的解為F(n)=C(2n,n)/(n+1)
思路是先求所有從(0,0)到(n,n)的路徑數X,再求所有穿過主對角線L的從(0,0)到(n,n)的路徑數Y,用前者減去後者得到所求。
從(0,0)到(n,n)的路徑數顯然是C(2n,n),一共要走2n步到達右上角,其中向右和向上各n步,總走法是C(2n,n)。
考慮一個新增的位置(n-1,n+1),它位於終點的左上角一個格處,設所有從(0,0)到(n-1,n+1)的路徑數為Z,下面要證明Y和Z相等,從而通過求Z來求Y。
考慮從(0,1)到(n-1,n)的對角線L2,對於所有穿過L而到達終點的路徑,一定會接觸到L2,找出某路徑第一次接觸到L2的位置M1,將從M1到終點的路徑沿L2做對摺一定會得到一條從M1到(n-1,n+1)的路徑,故每條穿過L到達終點的路徑都對應一條到達(n-1,n+1)的路徑,即有Y<=Z。
所有從起點到達(n-1,n+1)的路徑都一定會穿過L2,找出某路徑第一次穿過L2的位置M2,將M2到(n-1,n+1)的路徑沿L2對摺,就得到一條M2到(n,n)的路徑,且該條路徑一定穿過L,故每條到達(n-1,n+1)的路徑都對應一條穿過L到達終點的路徑,即有Z<=Y。
故Z==Y。
接下來通過求Z來求Y。Z是顯然的從(0,0)到(n-1,n+1)共需走2n步,其中向右n-1步、向上n+1步,故Z=C(2n,n-1)。
由以上可知F(n)=X-Y=X-Z=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)。證畢。
由以上可知問題1的解也是F(n)=C(2n,n)/(n+1),故求和(k){F(k)*F(n-1-k)}=C(2n,n)/(n+1)。這個數稱為卡特蘭數,前幾項為1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796。
除了上面描述的四個問題外,它對應的問題還有:
矩陣鏈所有乘法順序問題(同問題1)。
凸多邊形剖分成三角形的方法數(同問題1)。
3 Responses to “卡特蘭數”
carter Says:
一月 6th, 2011 at 5:50 下午
請問樓主對括號配對和入棧出棧這2個問題,如何分析成F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}? 並且如何進一步分析成C(2n,n)-C(2n,n-1)?
chris Says:
一月 10th, 2011 at 9:26 上午
這兩個問題與棋盤問題都是同質的,這個很明顯。而棋盤問題實際是可以寫成F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}的,我上面好像忘了寫了,等我下午考完試來補上吧。
chris Says:
一月 10th, 2011 at 4:24 下午
原來我上面已經證明過了。因為入棧出棧問題和括號配對問題與棋盤街問題同質(考慮入棧和一個左括號等於向右走一格,出棧和一個右括號等於向左走一格);而棋盤街問題可以分析成F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)}(文中有證明)。