組合數學及其應用——卡特蘭數


  卡特蘭數是組合數學中常見也是重要的特殊計數公式。

  首先給出一個現實問題的模型:

  給出凸多邊形的邊數n,求解該凸多邊形內部不相交的對角線把這個區域分成三角形區域的方法數。

 

  首先我們進行初步的分析,當n=2,h2=1,也就是說對於三角形,划分的情況數是1.這似乎有些不好理解,由於三角形內部無法添加對角線,所以符合情況的就是三角形本身,情況數為1.

 

  下面我們討論n取任意值的情況。

  看下面的圖。

 

  考慮將n+1凸邊形的子問題,即我們將AB視為基邊,枚舉C的位置,有n-1個可枚舉位置,然后結合基本的計數原理,我們能夠看到下面的遞推式能夠不重不漏的表示出h[n].

 

   

  而現在的問題在於,這樣的遞推公式是我們不喜愛的,我們喜歡的形式是斐波那契數列,給出的是前后項的關系式然后我們可以在線性時間復雜度下求出該數列,那么下面我們需要討論的便是如何得到這個遞推公式的解。

 

 

 

  下面是根據這條結論計算卡特蘭數列的JAVA代碼:

 

import java.io.*;
import java.util.*;
import java.math.BigInteger;


public class Main
{
 public static void main(String args[])
 {  
  BigInteger[] a = new BigInteger[101];
  a[0] = BigInteger.ZERO;
  a[1] = BigInteger.valueOf(1);
  for(int i = 2; i <= 100; ++i)
   a[i] = a[i - 1].multiply(BigInteger.valueOf(4 * i - 2)).divide(BigInteger.valueOf(i+1));
   Scanner in = new Scanner(System.in);
   int n;
   while(in.hasNext())
   {
    n = in.nextInt();
    System.out.println(a[n]);
   }
 }
}

  

 

 在引入卡特蘭數列的實例模型中,我們從h1開始計數,考慮一般計數數列的使用習慣(從h0)開始,這里我們重新給出卡特蘭數的定義:

 

 

  這個定理將一系列的計數問題與卡特蘭數聯系了起來,而其中的關鍵就是部分和滿足的那個大於等於0的不等式,下面呈現這個定理的證明,隨后將會討論一系列與之有關的實際問題。

 

   

 

  下面我們就來看幾個通過這個定理聯系在一起的實例。

   Ex1:2n個人排成一列進入劇場。入場券是50美分,2n個人中n個人手中有50美分,m個人手中有一元的紙幣。劇場售票處的機械用一個空的收音機開始售票。有多少中排隊方法能夠成功的銷售2n張票?

 

  分析:先簡單化的考慮,將每個人視為相同的元素。將這個實際問題與剛剛給出的定理聯系,題目的一個最大限制是,這個序列每當出現1美元的時候,售票處必須有大於一張的50美分。若我們將排隊序列中50美分記為+1,1元紙幣記作-1,那么對於我們排出的能夠成功售出2n張票的序列,必須滿足這個序列1~k這一段的和大於等於0(k∈[1,2n]),這就和定理內容聯系了起來。再基於計數結果,將拿50美分的n個人視為不同元素,需要對n進行全排列。對拿1美元的人也是這樣處理。

 

 

   Ex2:考慮在這樣一個n x n的方格紙上,你當前的位置是(0,0),現在你的目標是(n,n),每一步中你可以選擇上、下、左、右中任意一個方向前進一個單位長度,那么在所有從(0,0)到(n,n)的路線中,要求每一條路線中不能夠穿越這個方格紙的對角線,那么請問有多少條符合要求的路線?

  注:所有路線均在2n步完成。

  分析:題目要求不能夠穿過對角線,那么我們恰好將對角線當做對稱軸,考慮上半部分可行的路線,根據對稱性將最終的結果乘2即可。考察這樣一個“上三角”區域,容易看到整條路線其實是n個+1和n個-1組成的序列,而所謂的+1、-1在這個問題中的具體含義便是:+1代表向上走一個單位長度,-1代表向右走一個單位長度。由於“不能越過對角線”這條限制,能夠看到這個序列必須滿足任意前k項和大於等於0的要求,這就又和上文我們給出的定理呼應起來,即我們可以得到結論,上三角區域的路線數是第n+1卡特蘭數Cn

  即對於n x n的方格,總路線為2Cn.

 

  Ex3:當前有n個元素,我們需要將它們分別壓入棧中然后全部取出,那么請問有多少中壓棧(出棧)方案?

  分析:其實這個問題能夠更加典型的詮釋上文給出的定理。這里壓棧操作我們視為+1,出棧操作視為-1,那么很顯然能夠完成n個元素均壓入棧中並取出的條件是在2n個操作形成的+1、-1序列中,對於任意k,前k項要大於等於0,其結果是第n+1個卡特蘭數Cn

 

 

  擬Catalan數:

                           

  

   

   分析:首先我們需要注意的一個問題是,在構造乘法方案的過程中,a x b和b x a是兩種不同的方案,雖然在很多運算中是滿足乘法交換律的,但對於矩陣乘法便不符合,雖然這里我們不討論運算的結果。清楚這一點,將有利於理解后面的分析過程。

 

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM