卡特蘭數與錯排公式 — 例題講解,歡迎回復交流

卡特蘭數與錯排公式

在很多算法題目中,我們經常遇到計數類型的問題。直觀的來說,我們會去尋找其直接計算的公式,或者遞推計算的規律。然而找規律是一件很需要靈感的事情,且在短時間內往往難以確定其是否完備可靠。事實上,很多計數問題都已經被前人反覆研究證明,有了簡化而優美的模型。

卡特蘭數和錯排公式是我個人在算法問題中遇到的比較多兩個問題,因此想要專門記錄一下。後續如果再遇到類似有固定的遞推公式解法的問題,也會再添加儘量,希望做成一個專題。

卡特蘭數

卡特蘭數是在計數問題中經常出現的一個序列,有良好的性質,他的遞推公式爲,

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2)

可以在其基礎可以推導出通項公式,但是生硬的背通項公式往往效果較差,能夠在理解的基礎上記憶遞推公式意見足夠了。用一道例題來加深理解。

Unique Binary Search Trees (LeetCode 96)

Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?

Solution

(a) optimal substructure and DP equation

通過觀察題目,可知最小搜索樹的性質是,結點的左子樹小於該結點,右子樹大於該結點,因此可以根據整棵樹所選根節點的不同分爲兩部分。整體可構成的搜索樹總數,等於左右兩棵子樹的不同搜索樹數目的乘積。
根據該性質,定義 OPT(i) 爲BST在有 i 個結點的情況下,以 j 作爲根節點的不同的BST的數量,遞推式可以表示如下

OPT(i)=j=1iOPT(j1)OPT(ij) OPT(i)=\sum_{j=1}^{i}OPT(j-1)*OPT(i-j)

(b) pseudo-code

def unique_bst(n):
    OPT = [0 for _ in range(n+1)]
    OPT[0], OPT[1] = 1, 1
    for i in range(2, n+1):
        OPT[i] = 0
        for j in range(1, i+1):
            OPT[i] += OPT[j-1] * OPT[i-j]
    return OPT[n]

(c ) prove the correctness

在搜索二叉樹中,對於一個特定的根來說,唯一二叉樹的數量是其左子樹的數量乘以右子樹的數量,並且,左右子樹的形態數量與具體的數字是無關的,只與數裏的結點數目有關,因此可以使用OPT數組之前保存的結果進行遞推計算。

(d) complexity

時間複雜度爲 O(1+2+…+n) = O(n^2)

錯排公式

錯排問題是組合數學中的問題之一。考慮一個有n個元素的排列,若一個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱爲原排列的一個錯排。 n個元素的錯排數記爲D(n)。 研究一個排列錯排個數的問題,叫做錯排問題或稱爲更列問題

錯排問題的遞推公式爲 D(n) = (n-1)( D(n-1) + D(n-2) ),還是用一道例題來理解這個公式。

發錯信件問題(HDOJ 1465 不容易系列之一

HDU有個網名叫做8006的男性同學,結交網友無數,
最近該同學玩起了浪漫,同時給n個網友每人寫了一封信,
這都沒什麼,要命的是,
他竟然把所有的信都裝錯了信封!注意了,是全部裝錯喲!
現在的問題是:請大家幫可憐的8006同學計算一下,
一共有多少種可能的錯誤方式呢?

根據題目描述,這是典型的錯排問題。
在這個題目中理錯排公式,假設給a b c … 的信原本應該分別裝入A B C … 信封中,但是現在裝錯了,可以分兩種情況來理解。

  1. a裝到了B中,b裝到了A中。此時a和b都已經裝錯了,在此基礎上,把其他信都裝錯的方式爲爲 D(n-2)。同時,a和b的選取方式有 Cn2=(n1)C_n^2=(n-1) 種,因此裝錯方式爲 (n-1)D(n-2)種。
  2. a裝到了B中,b不能裝到A中。++此時的任務變成了 n-1 項的錯排,即 D(n-1) ++。而類似上面例子,a和B的選取方式有 Cn2=(n1)C_n^2=(n-1) 種,因此裝錯方式爲 (n-1)D(n-2)種。

綜合上面兩種情況,可以很好的理解錯排公式爲 D(n) = (n-1)( D(n-1) + D(n-2) )

理解難點

第一種情況其實比較好理解,好多人會對第二種情況中下劃線部分的轉換有些困惑。
這時候需要轉換一下思想,除去a b之外,c d e… 總共 n-2 項需要錯排。而b呢,如果把b裝入A,就又變成了第一種情況,我們可以假設b原本的位置就是要裝入A,但是爲了和第一種情況分開討論,要求b必須不能裝入A,這就又變成了一個錯排問題,因此纔有了 D(n-1)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章