日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

卡特兰数~

發(fā)布時(shí)間:2024/1/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卡特兰数~ 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘dalao:Ypuyu、長(zhǎng)滿石楠的荒原

卡特蘭數(shù)是組合數(shù)學(xué)中一個(gè)常在各種計(jì)數(shù)問(wèn)題中出現(xiàn)的數(shù)列。以比利時(shí)的數(shù)學(xué)家歐仁·查理·卡塔蘭(1814–1894)命名。歷史上,清代數(shù)學(xué)家明安圖(1692年-1763年)在其《割圜密率捷法》最早用到“卡塔蘭數(shù)”,遠(yuǎn)遠(yuǎn)早于卡塔蘭。有中國(guó)學(xué)者建議將此數(shù)命名為“明安圖數(shù)”或“明安圖-卡塔蘭數(shù)”。

即卡特蘭數(shù)是符合以下公式的一個(gè)數(shù)列

公式(常見(jiàn)4個(gè)):

h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2, h(0)=h(1)=1)

公式證明(摘自百度百科)

在2n位上填入n個(gè)0的方案數(shù)為

。而從

?中減去不符合要求的方案數(shù)即為所求答案。

在從左往右掃時(shí),必然會(huì)在某一個(gè)奇數(shù)位2p+1上首先出現(xiàn)p+1個(gè)1,和p個(gè)0

此后的 [2p+2,2n]上的2n?(2p+1)位有n?p個(gè)0, n?p?1個(gè)1。如若把后面這部分2n?(2p+1)位的1與0互換,使之成為n?p個(gè)1,n?p?1個(gè)0,結(jié)果得1個(gè)由n+1個(gè)1和n?1個(gè)0組成的2n位數(shù),即一個(gè)不合法的方案必定對(duì)應(yīng)著一個(gè)由n+1個(gè)1和n-1個(gè)0組成的一個(gè)排列

可以倒過(guò)來(lái)反證:

任意一個(gè)由n+1個(gè)1和n-1個(gè)0組成的一個(gè)排列,由于1的個(gè)數(shù)多了2個(gè),且2n為偶數(shù),所以必定在某個(gè)奇數(shù)位2p+1上出現(xiàn)1的個(gè)數(shù)超過(guò)0的個(gè)數(shù)。同樣把后面部分1和0互換,成為了由n個(gè)0和n個(gè)1組成的2n位數(shù)。

由此,每一個(gè)不合法的方案總是與唯一一個(gè)由n+1個(gè)1和n?1個(gè)0組成的排列一一對(duì)應(yīng)。

于是,不合法的方案數(shù)就可以寫作:

例如 10100101

是由4個(gè)0和4個(gè)1組成的8位2進(jìn)制數(shù)。但從左而右掃描在第5位(顯示為紅色)出現(xiàn)0的累計(jì)數(shù)3超過(guò)1的累計(jì)數(shù)2,它對(duì)應(yīng)于由3個(gè)1,5個(gè)0組成的10100010。

反過(guò)來(lái) 10100010

對(duì)應(yīng)于 10100101

因而不合要求的2n位數(shù)與n+1個(gè)0,n-1個(gè)1組成的排列一一對(duì)應(yīng),故有“卡塔蘭數(shù)”Catalan

敲一敲重點(diǎn)!!!


以下內(nèi)容摘自卡特蘭數(shù)

(1)卡特蘭數(shù)滿足以下性質(zhì):
令h(0)=1,h(1)=1,catalan數(shù)滿足遞推式。h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2)。也就是說(shuō),如果能把公式化成上面這種形式的數(shù),就是卡特蘭數(shù)。
當(dāng)然,上面這樣的遞推公式太繁瑣了,于是數(shù)學(xué)家們又求出了可以快速計(jì)算的通項(xiàng)公式。h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,…)。這個(gè)公式還可以更簡(jiǎn)單得化為h(n)=C(2n,n)/(n+1)。后一個(gè)公式都可以通過(guò)前一個(gè)公式經(jīng)過(guò)幾步簡(jiǎn)單的演算得來(lái),大家可以拿起筆試試,一兩分鐘就可以搞定。(2)卡特蘭數(shù)經(jīng)常出現(xiàn)在OI以及ACM中,在生活中也有廣泛的應(yīng)用。下面舉幾個(gè)例子。

  • 進(jìn)出棧問(wèn)題:棧是一種先進(jìn)后出(FILO,First In Last Out)的數(shù)據(jù)結(jié)構(gòu).如下圖1,1,2,3,4順序進(jìn)棧,那么一種可能的進(jìn)出棧順序是:1In→2In→2Out→3In→4In→4Out→3Out→1Out, 于是出棧序列為1,3,4,2。

    那么一個(gè)足夠大的棧的進(jìn)棧序列為1,2,3,?,n時(shí)有多少個(gè)不同的出棧序列?
    我們可以這樣想,假設(shè)k是最后一個(gè)出棧的數(shù)。比k早進(jìn)棧且早出棧的有k-1個(gè)數(shù),一共有h(k-1)種方案。比k晚進(jìn)棧且早出棧的有n-k個(gè)數(shù),一共有h(n-k)種方案。所以一共有h(k-1)*h(n-k)種方案。顯而易見(jiàn),k取不同值時(shí),產(chǎn)生的出棧序列是相互獨(dú)立的,所以結(jié)果可以累加。k的取值范圍為1至n,所以結(jié)果就為h(n)= h(0)h(n-1)+h(1)h(n-2) + … + h(n-1)h(0)。
    出棧入棧問(wèn)題有許多的變種,比如n個(gè)人拿5元、n個(gè)人拿10元買物品,物品5元,老板沒(méi)零錢。問(wèn)有幾種排隊(duì)方式。熟悉棧的同學(xué)很容易就能把這個(gè)問(wèn)題轉(zhuǎn)換為棧。值得注意的是,由于每個(gè)拿5元的人排隊(duì)的次序不是固定的,所以最后求得的答案要n!。拿10元的人同理,所以還要n!。所以這種變種的最后答案為h(n)*n!*n!。

  • 二叉樹(shù)構(gòu)成問(wèn)題。有n個(gè)結(jié)點(diǎn),問(wèn)總共能構(gòu)成幾種不同的二叉樹(shù)。
    我們可以假設(shè),如果采用中序遍歷的話,根結(jié)點(diǎn)第k個(gè)被訪問(wèn)到,則根結(jié)點(diǎn)的左子樹(shù)有k-1個(gè)點(diǎn)、根結(jié)點(diǎn)的右指數(shù)有n-k個(gè)點(diǎn)。k的取值范圍為1到n。講到這里就很明顯看得出是卡特蘭數(shù)了。這道題出現(xiàn)在2015年騰訊實(shí)習(xí)生的在線筆試題中。

  • 凸多邊形的三角形劃分。一個(gè)凸的n邊形,用直線連接他的兩個(gè)頂點(diǎn)使之分成多個(gè)三角形,每條直線不能相交,問(wèn)一共有多少種劃分方案。
    這也是非常經(jīng)典的一道題。我們可以這樣來(lái)看,選擇一個(gè)基邊,顯然這是多邊形劃分完之后某個(gè)三角形的一條邊。圖中我們假設(shè)基邊是p1pn,我們就可以用p1、pn和另外一個(gè)點(diǎn)假設(shè)為pi做一個(gè)三角形,并將多邊形分成三部分,除了中間的三角形之外,一邊是i邊形,另一邊是n-i+1邊形。i的取值范圍是2到n-1。所以本題的解c(n)=c(2)*c(n-1)+c(3)*c(n-2)+…c(n-1)*c(2)。令t(i)=c(i+2)。則t(i)=t(0)*t(i-1)+t(1)*t(i-2)…+t(i-1)*t(0)。很明顯,這就是一個(gè)卡特蘭數(shù)了。

  • 有n+1個(gè)葉子的滿二叉樹(shù)的個(gè)數(shù)?事實(shí)上,向左記為+1,向右記為?1,按照向左優(yōu)先的原則,從根節(jié)點(diǎn)開(kāi)始遍歷.例如第一個(gè)圖記為+1,+1,+1,?1,?1,?1,于是由卡特蘭數(shù)的含義可得滿二叉樹(shù)的個(gè)數(shù)為Cn。

  • 在n*n的格子中,只在下三角行走,每次橫或豎走一格,有多少中走法?其實(shí)向右走相當(dāng)于進(jìn)棧,向左走相當(dāng)于出棧,本質(zhì)就是n個(gè)數(shù)出棧次序的問(wèn)題,所以答案就是卡特蘭數(shù)。(利用這個(gè)模型,我們解決這個(gè)卡特蘭問(wèn)題的變形問(wèn)題,并順便給進(jìn)出棧問(wèn)題的解法一個(gè)幾何解釋.)

  • 將一個(gè)凸n+2邊形區(qū)域分成三角形區(qū)域的方法數(shù)?(答案卡特蘭數(shù))

    先介紹兩個(gè)關(guān)于卡特蘭數(shù)Cn的小引理,將問(wèn)題一中的+1和?1分別看成左括號(hào)和右括號(hào),我們得到

  • 引理一 由nn對(duì)括號(hào)形成的合法括號(hào)表達(dá)式的個(gè)數(shù)為C.

    比如n=3時(shí),所有合法的括號(hào)表達(dá)式有 ?(())),(())(),()(()),()()(),(()()),共5個(gè).

    考慮n+1個(gè)數(shù)相乘,不同的相乘順序的數(shù)目.我們可以給出每一個(gè)合法的括號(hào)表達(dá)式和一種可能的相乘順序的對(duì)應(yīng)方式.如n=3時(shí),先取44個(gè)數(shù)a,b,c,d,然后在第一個(gè)數(shù)下設(shè)一個(gè)指針,將一個(gè)左括號(hào)看成是指針右移一格,而將右括號(hào)看成是將指針當(dāng)前指向的數(shù)與其左側(cè)的一個(gè)數(shù)作乘積,并刪除左側(cè)的那個(gè)數(shù),那么當(dāng)執(zhí)行完括號(hào)表達(dá)式,就得到了一種可能的相乘順序,如圖.

    這樣我們就從引理一出發(fā)得到了

    引理二 n+1個(gè)數(shù)連乘,不同的乘法順序數(shù)為Cn.

    注 這樣也是RPN模式的計(jì)算機(jī)的工作模式,可以無(wú)需括號(hào)完成計(jì)算,從而節(jié)省按鍵的次數(shù).這種計(jì)算器在財(cái)務(wù)計(jì)算中大量使用,如圖.

    接下來(lái)解決卡特蘭問(wèn)題,用1,2,3,?,n+2標(biāo)記凸n+2邊形的邊,從標(biāo)記為1的邊的起點(diǎn)(按逆時(shí)針?lè)较?#xff09;開(kāi)始按未標(biāo)記的對(duì)角線均為向外標(biāo)記方向,如圖.
    (分別標(biāo)記邊和對(duì)角線)
    進(jìn)而,逆時(shí)針讀圖,將出的箭頭讀為左括號(hào),進(jìn)的箭頭讀為右括號(hào),就得到了剖分方式與連乘順序的對(duì)應(yīng).上圖中的兩個(gè)圖對(duì)應(yīng)的連乘順序表達(dá)式分別為 :1((2(34))5)6,(1(23))(45)6,

    拋開(kāi)6不計(jì),每個(gè)連乘順序表達(dá)式實(shí)際上就是規(guī)定了n+1個(gè)數(shù)連乘時(shí),不同的乘法順序,根據(jù)引理一,得到剖分方式的總數(shù)為Cn。

  • 在圓上選擇2n個(gè)點(diǎn),將這些點(diǎn)成對(duì)連接起來(lái)使得所得到的n條線段不相交的方法數(shù)?和凸包切割一個(gè)原理。(答案卡特蘭數(shù))

    為了解決這個(gè)問(wèn)題,我們重新解釋卡特蘭數(shù)的推導(dǎo)方式.先解決下面的輔助問(wèn)題:(+1表示向左,-1表示向右)
  • 圓周上有2n+1個(gè)點(diǎn),其中n+1個(gè)點(diǎn)上標(biāo)“+1”,n個(gè)點(diǎn)上標(biāo)“?1”,如果可以找到某個(gè)標(biāo)有“+1”的點(diǎn)作為起點(diǎn),當(dāng)順時(shí)針沿圓周前進(jìn)時(shí)將所遇到的點(diǎn)(包括起點(diǎn))上標(biāo)的數(shù)相加得到的和始終為正數(shù),就稱這種標(biāo)記法是好標(biāo)記法.求好標(biāo)記法的總數(shù)(注意考慮圓排列).

    輔助問(wèn)題的解 對(duì)于任何一種標(biāo)記法,我們將順時(shí)針相鄰的“+1”“?1”(指順時(shí)針前進(jìn)時(shí)先遇到“+1”后遇到“?1”)同時(shí)抹去,可以證明抹去的前后對(duì)標(biāo)記法的好壞沒(méi)有影響.不停的重復(fù)這一過(guò)程,則最后只剩一個(gè)標(biāo)有“+1”的點(diǎn),顯然此時(shí)標(biāo)記法為好的.因此所有的標(biāo)記法都是好標(biāo)記法,顯然其數(shù)目為 (1/2n+1)C(2n+1,n)-(1/n+1)C(2n,n)

    問(wèn)題的解 通過(guò)對(duì)輔助問(wèn)題的進(jìn)一步探索可知,每一種將圓周上2n+1個(gè)點(diǎn)標(biāo)記為n+1個(gè)+1點(diǎn),和n個(gè)?1點(diǎn)的方法唯一確定一個(gè)順時(shí)針前進(jìn)的方案(即起點(diǎn)).我們將這個(gè)起點(diǎn)刪去,剩下的2n個(gè)點(diǎn)在順時(shí)針?lè)较蛏弦欢椤?#43;1”“?1”“+1”“?1”,…,此時(shí)將順時(shí)針相鄰的這些“+1”“?1”點(diǎn)用弦連接起來(lái),就得到互不相交的n條弦.這樣我們就建立了從好標(biāo)記法到弦的連法的單射.

    反過(guò)來(lái),如果我們有了一種弦的連法,就可以從某條弦的端點(diǎn)出發(fā)順時(shí)針前進(jìn),對(duì)每條弦的兩個(gè)端點(diǎn)都是先遇到的端點(diǎn)標(biāo)上“+1”,后遇到的端點(diǎn)標(biāo)上“?1”,然后在最后回到出發(fā)點(diǎn)時(shí)添上一個(gè)標(biāo)有“+1”的點(diǎn).這樣我們就建立了從弦的連法到好標(biāo)記法的單射.

    綜上,所求的不同連法數(shù)為(1/n+1)C(2n,n).


    ?

    總結(jié)

    以上是生活随笔為你收集整理的卡特兰数~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。