組合數(shù)學(xué)-Catalan數(shù)

從這節(jié)開始,我們遇到的組合數(shù)可能會比較大,大到long long存不下哗讥,那怎么辦嚷那?c++大數(shù)板子歡迎你...c++大數(shù)板子有好多版本胞枕,自己寫的舒服直接保存下來備用即可,這里我不再提供魏宽,不過腐泻,這里我給大家準(zhǔn)備了Java大數(shù)運(yùn)算的簡單代碼,Java自帶大數(shù)運(yùn)算這個(gè)實(shí)屬良心之舉队询,可以關(guān)注我博客派桩,傳送門,只是簡單介紹哦蚌斩,深入探討咨詢度娘铆惑。

開始正題,Catalan數(shù)是一組比較神奇的數(shù)字1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670,不要小看這組數(shù)字送膳,他的神秘之處在于:我們記C[n]為Catalan數(shù)列第n+1個(gè)數(shù)员魏,從0開始,也就是說C[0] = 1 , C[1] = 1 , C[2] = 2 ... 結(jié)果你會發(fā)現(xiàn):

  • 1 如果序列1叠聋,2撕阎,...,n入棧碌补,那么C[n] 就是這組數(shù)字出棧的排列種數(shù)虏束,也就是對應(yīng)的Catalan數(shù)棉饶。
  • 2 對一個(gè)有N + 2 條邊的凸多邊形(N>=1)用連接頂點(diǎn)的不相交對角線將該多邊形拆分成若干三角形,那么C[n]就是拆分的方法數(shù)镇匀,也就是對應(yīng)的Catalan數(shù)照藻。
  • 3 具有n個(gè)節(jié)點(diǎn)的二叉樹有多少種呢?C[n]個(gè)坑律,也就是對應(yīng)的Catalan數(shù)岩梳。
  • 4 給出n對括號,括號正確配對的字符串個(gè)數(shù)就是C[n]對應(yīng)的Catalan數(shù)晃择。
  • 更多Catalan數(shù)的應(yīng)用可以查詢百度冀值。
那么重點(diǎn)來了,既然Catalan數(shù)這么神奇宫屠,這Catalan數(shù)有什么共性呢列疗?其實(shí)是有的:

Catalan數(shù)的計(jì)算公式是 C[0] = 1 , C[1] = 1 , C[n] = C[0] * C[n-1] + C[1] * C[n-2] + C[2] * C[n-3]+....+C[n-1] * C[0].
Catalan數(shù)的遞推公式為C[n] = C[n-1](4n-2)/(n+1),這樣我們就可以愉快的遞推了浪蹂。

這里我選擇將入棧數(shù)這個(gè)應(yīng)用講一下證明抵栈,其它的應(yīng)用,大家也可以在百度上找到坤次,網(wǎng)上關(guān)于這些的博客也有很多古劲,我就不一一講解了,其實(shí)我自己也并不掌握很好缰猴,避免誤人子弟(??逃....
??N個(gè)數(shù)出棧排列數(shù)的證明

設(shè)C[n]是序列1产艾,2....N入棧后,出棧的排列數(shù)滑绒。顯然闷堡,C[0] = 1 C[1] = 1 C[2] = 2 ; 對于C[n] (n>=2) 如果第一個(gè)出棧的數(shù)是K,則K這個(gè)數(shù)字將序列1.....N分成兩個(gè)子序列:序列1....K-1(長度為K-1疑故,已經(jīng)入棧) 和序列 K+1.....N(長度為N-K杠览,尚未入棧),則由乘法原理纵势,如果第一個(gè)出棧數(shù)是K踱阿,則出棧的排列數(shù)為F[k] = C[k-1] * C[n-k];钦铁,因?yàn)?<=K<=N,則N個(gè)數(shù)總的排列方法為K從1取值到N软舌,即F[1]+F[2].....+F[N] ;即C[N] = C[0]C[n-1]+C[1]C[n-2]+....+C[n-1]*C[0]育瓜;即Catalan數(shù)的公式葫隙。

碼到這里累死我了.....??.....插播一條廣告吧:有沒有對機(jī)器學(xué)習(xí),物聯(lián)網(wǎng)躏仇,大數(shù)據(jù)恋脚,云計(jì)算感興趣的童鞋腺办,我有個(gè)交流群,想把它建設(shè)起來糟描,大家來助力哇怀喉,有想法的私聊我,咱們大二大三的時(shí)候一塊做項(xiàng)目??

廣告之后船响,馬上回來躬拢,接下來,我給出一道Catalan數(shù)列應(yīng)用的題见间,大家看一下:

題面:

這是一個(gè)很小但是很古老的游戲聊闯。請您以順時(shí)針順序在地上寫下連續(xù)的數(shù)字:1,2米诉,3.....2N-1菱蔬,2N。這2N個(gè)數(shù)字形成一個(gè)圓圈史侣;然后拴泌,你來畫一些線段,將這些書連接成整數(shù)的數(shù)對惊橱,每一個(gè)數(shù)都要連到另一個(gè)數(shù)字上蚪腐,而且沒有兩個(gè)線段是相交的。這是個(gè)簡單的游戲是不是税朴?當(dāng)您寫完這些數(shù)字的時(shí)候回季,您來告訴大家,對于輸入的N可以有多少種不同的方式將這些數(shù)字連成數(shù)對掉房?(1<=N<=100)

解析

先確定一個(gè)點(diǎn)茧跋,然后枚舉其它的點(diǎn)P與這個(gè)點(diǎn)相連慰丛,構(gòu)成一條線段卓囚,保證這條線段把所有的點(diǎn)分成兩部分,且都是偶數(shù)個(gè)诅病,也就是整數(shù)對個(gè)哪亿。那么這樣的點(diǎn)P有N個(gè),(到時(shí)候我可以畫圖演示贤笆,這里不懂現(xiàn)在可以私聊我)蝇棉,設(shè)這條線段左邊有i對點(diǎn),那么這條線段左邊的點(diǎn)的連接方法數(shù)就有C[i]種芥永,而線段右邊有n-i-1對點(diǎn)篡殷,(因?yàn)橛幸粭l線段已經(jīng)連接了一對點(diǎn),所以剩下n-1對點(diǎn)埋涧,也就是2*n-2個(gè)點(diǎn))板辽,所以我們可以得到遞推公式:C[n] = C[i] * C[n-i-1] ( i從0到n-1) , 而這一遞推公式正是Catalan數(shù)的遞推公式奇瘦。
為了提高效率,我們先離線計(jì)算出前110個(gè)Catalan數(shù)來劲弦,由于Catalan數(shù)的上限超過了long long的范圍耳标,所以我們得采用用高精度計(jì)算了。
Java高精度簡單學(xué)習(xí)??傳送門

Java代碼:
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        int k = in.nextInt();
        while(k!=-1){
            BigInteger a,b;
            a = BigInteger.valueOf(1);
            b = BigInteger.valueOf(1);
            for(int i = 2; i <= k; i++) {
                b = a.multiply(BigInteger.valueOf(4*i-2));
                b = b.divide(BigInteger.valueOf(i+1));
                a = b;
            }
            System.out.println(b);
            k = in.nextInt();
        }
        in.close();
    }
}

其實(shí)無非就是用了一個(gè)遞推公式C[n] = C[n-1](4n-2)/(n+1)邑跪,這是Catalan數(shù)的遞推公式次坡,問題在于大數(shù)運(yùn)算,如果選擇Java的話画畅,在程序編寫上應(yīng)該就比較輕松砸琅。

注意,這里只是簡單介紹了Catalan數(shù)列轴踱,如果深入研究可以參考其他大牛的Blog明棍,深入探討已經(jīng)超出了我這個(gè)組合數(shù)學(xué)小白的能力(菜是原罪)。有問題可以私聊我寇僧,歡迎指正摊腋,謝謝啦...

大家對于Catalan數(shù)列其它應(yīng)用的理解也可以找我討論,僅討論而已??

接下來會有Bell數(shù)和stirling數(shù)的應(yīng)用嘁傀,敬請期待...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兴蒸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子细办,更是在濱河造成了極大的恐慌橙凳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笑撞,死亡現(xiàn)場離奇詭異岛啸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茴肥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門坚踩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氏身,“玉大人惋耙,你說我怎么就攤上這事【铮” “怎么了础锐?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵嗓节,是天一觀的道長。 經(jīng)常有香客問我皆警,道長拦宣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鸵隧,結(jié)果婚禮上桐愉,老公的妹妹穿的比我還像新娘。我一直安慰自己掰派,他們只是感情好从诲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靡羡,像睡著了一般系洛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上略步,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天描扯,我揣著相機(jī)與錄音,去河邊找鬼趟薄。 笑死绽诚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杭煎。 我是一名探鬼主播恩够,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羡铲!你這毒婦竟也來了蜂桶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤也切,失蹤者是張志新(化名)和其女友劉穎扑媚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雷恃,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疆股,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倒槐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旬痹。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖导犹,靈堂內(nèi)的尸體忽然破棺而出唱凯,到底是詐尸還是另有隱情羡忘,我是刑警寧澤谎痢,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站卷雕,受9級特大地震影響节猿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一滨嘱、第九天 我趴在偏房一處隱蔽的房頂上張望峰鄙。 院中可真熱鬧,春花似錦太雨、人聲如沸吟榴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吩翻。三九已至,卻和暖如春锥咸,著一層夾襖步出監(jiān)牢的瞬間狭瞎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工搏予, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熊锭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓雪侥,卻偏偏與公主長得像碗殷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子速缨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容