• 对卡塔兰数的理解


    卡塔兰数定义

    f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)

          = f(k-1)f(n-k) k=1...n

    以k为轴划分子问题,左边子问题的解的个数和右边子问题的解的个数是原问题以k为轴的解法的2个独立步骤,适用乘法原理

    分别以1,2,。。。n为轴,是原问题的n种解法,适用加法原理。

    与卡塔兰数有关问题通常满足如下描述:有一个大问题A,规模为n,要解决这个问题,可以用分治的思想,首先固定其中某一个元素,将剩下的n-1个元素拆分成两个小问题,这两个小问题的规模分别是(0,n-1) (1,n-2) (2,n-3) ... (n-1,0)

    举几个例子:
    1. 二叉树计数,n个结点的二叉树,首先固定根节点,将剩下的n-1个结点拆分给左右子树
    2. 三角形划分问题,凸(n+2)边形可以划分为n个三角形,首先固定一条边(即一个三角形),这个三角形将这个(n+2)边形拆分成两个更小的多边形。

    有关卡塔兰数详细的数学证明,性质和应用,查阅维基百科卡塔兰数

    有关卡塔兰数的几何证明(折线),参考某博主的博客卡塔兰数

    下面是一个简单的卡塔兰数应用:

    就跟斐波那契数列一样,我们把n = 0 时赋为1,因为空树也算一种二叉搜索树,那么n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。那么n = 2时,由于1和2都可以为跟,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:

    dp[2] =  dp[0] * dp[1]   (1为根的情况)

        + dp[1] * dp[0]    (2为根的情况)

    同理可写出 n = 3 的计算方法:

    dp[3] =  dp[0] * dp[2]   (1为根的情况)

        + dp[1] * dp[1]    (2为根的情况)

          + dp[2] * dp[0]    (3为根的情况)

  • 相关阅读:
    在取数组的值之前,要判断数组是否为空
    Xcode更改新的Apple ID
    VS2012创建以及调用WebService
    VS添加服务引用和 Web引用的区别
    MongoDB环境搭建
    疑问
    修改导航栏标题的字体和颜色
    self.title,那么self.navigationItem.title和self.tabBarItem.title
    选中cell的时候分割线消失,如何让分割线不消失
    UITableViewCell的分割线顶头
  • 原文地址:https://www.cnblogs.com/lidan-prime/p/9059631.html
Copyright © 2020-2023  润新知