卡特兰数与错排公式 — 例题讲解,欢迎回复交流

卡特兰数与错排公式

在很多算法题目中,我们经常遇到计数类型的问题。直观的来说,我们会去寻找其直接计算的公式,或者递推计算的规律。然而找规律是一件很需要灵感的事情,且在短时间内往往难以确定其是否完备可靠。事实上,很多计数问题都已经被前人反复研究证明,有了简化而优美的模型。

卡特兰数和错排公式是我个人在算法问题中遇到的比较多两个问题,因此想要专门记录一下。后续如果再遇到类似有固定的递推公式解法的问题,也会再添加尽量,希望做成一个专题。

卡特兰数

卡特兰数是在计数问题中经常出现的一个序列,有良好的性质,他的递推公式为,

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)。

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