概要

在一些面试的智力题中会遇到此数的变形,如果完全不了解,直接想结果是很困难的,故在此简单介绍一下。

 


基本定义

Catalan 数的定义根据不同的应用环境有很多不同的定义方式,下面给出一个。

  Catalan 数:一个凸 \(n\) 边形,通过不相交于 \(n\) 边形内部的对角线,把 \(n\) 边形拆分成若干三角形,不同拆分的数目用 \(f(n)\) 表示,即称为 Catalan 数.

例如下五边形: 有 \(f(5) = 5\).

它有以下的递推关系:
\begin{align} \label{e1}
f(n+1) &= f(2)f(n)+f(3)f(n-1)+\cdots+f(n)f(2) = \sum_{k=2}^nf(k)f(n-k+2),\qquad f(2) = f(3) = 1 \\ \label{e2}
(n-3)f(n)&= \frac{n}{2}(f(3)f(n-1)+f(4)f(n-2)+\cdots+f(n-2)f(4)+f(n-1)f(3))
\end{align}

  证明:(a) 如下图:

以 \(v_1v_{n+1}\) 作为一个边的三角形 \(v_1v_kv_{n+1}\),将凸 \(n+1\) 边形分割成两部分,一部分是 \(k\) 边形,一部分是 \(n-k+2\) 边形,\(k=2,3,\cdots,n\). 依据加法法则有 \(f(n+1) = \sum_{k=2}^nf(k)f(n-k+2)\).

(b) 如下图:

从 \(v_1\) 点向其它 \(n-3\) 个顶点 \(\{v_3,v_4,\cdots,v_{n-1}\}\) 可引出 \(n-3\) 条对角线。对角线 \(v_1v_k\) 把 \(n\) 边形分割成两个部分,因此以 \(v_1v_k\) 对角线作为拆分线的方案数为 \(f(k)f(n-k+2)\),\(v_k\) 可以是 \(\{v_3,v_4,\cdots,v_{n-1}\}\) 中任一点,对所有这些点求和得:\(f(3)f(n-1)+f(4)f(n-2)+\cdots+f(n-2)f(4)+f(n-1)f(3)\). 以 \(v_2,v_3,\cdots,v_n\) 取代 \(v_1\) 点也有类似的结果。但考虑到对角线有两个顶点,同一对角线在两个顶点分别计算了一次,下式
\begin{align}
\frac{n}{2}(f(3)f(n-1)+f(4)f(n-2)+\cdots+f(n-2)f(4)+f(n-1)f(3))
\end{align}
没有给出剖分数,无疑其中有重复的。其重复度是由于一个凸边形的部分有 \(n-3\) 条对角线,而对其每一条边计数时该剖分都计数了一次,故重复了 \(n-3\) 次,即该式给出的结果是 \(f(n)\) 的 \(n-3\) 倍,证毕。

我们有了递推关系,下面说一下其计算公式。由式 \ref{e1} 及 \(f(2)=1\) 知:
\begin{align}
f(n+1)-2f(n) = f(3)f(n-1)+f(4)f(n-2)+\cdots+f(n-2)f(4)+f(n-1)f(3)
\end{align}
结合式 \ref{e2} 知
\begin{align}
(n-3)f(n) = \frac{n}{2}(f(3)f(n-1)+f(4)f(n-2)+\cdots+f(n-2)f(4)+f(n-1)f(3)) = \frac{n}{2} (f(n+1)-2f(n) )
\end{align}
整理得:
\begin{align}
nf(n+1) = (4n-6)f(n)
\end{align}
令 \(g(n+1) = nf(n+1)\) 得
\begin{align}
g(n+1) = (4n-6) \frac{g(n)}{n-1} = \frac{(2n-2)(2n-3)}{(n-1)(n-1)}g(n), \quad g(2) = f(2) = 1
\end{align}
则有以下等式成立:
\begin{align}
g(n+1) &= \frac{g(n+1)}{g(n)} \cdot \frac{g(n)}{g(n-1)} \cdot \frac{g(n-1)}{g(n-2)} \cdots \frac{g(4)}{g(3)} \cdot \frac{g(3)}{g(2)} \notag \\
&=\frac{(2n-2)(2n-3)}{(n-1)(n-1)} \cdot \frac{(2n-4)(2n-5)}{(n-2)(n-2)} \cdots \frac{(4)(3)}{(2)(2)} \cdot \frac{(2)(1)}{(1)(1)} \notag \\
&= \frac{(2n-2)!}{(n-1)!(n-1)!} = C_{2n-2}^{n-1} = nf(n+1) \notag
\end{align}
所以有最终的计算公式:
\begin{align}
f(n+1) = \frac{1}{n} C_{2n-2}^{n-1}
\end{align}
 

应用举例

 
  例 1. \(n\) 个 \(1\) 和 \(n\) 个 \(0\) 组成一 \(2n\) 位的二进制数,要求从左到右扫描,\(1\) 的累计数不小于 \(0\) 的累计数,试求满足这条件的数有多少?(与网易 2018 春季数据分析实习生笔试类似)

  解: 设 \(p_{2n}\) 为所求结果。在 \(2n\) 位上填入 \(n\) 个 \(1\) 的方案为 \(C_{2n}^n\),不填 \(1\) 的其余 \(n\) 位自动填以数 \(0\)。从 \(C_{2n}^n\) 中减去不符合要求的方案即为所求。

不合要求的数指的是从左而右扫描,出现 \(0\) 的累计数超过 \(1\) 的累计数的数。不合要求的数的特征是从左到右扫描时,必然,在某一奇数 \(2m+1\) 位上首先出现 \(m+1\) 个 \(0\) 的累计数,和 \(m\) 个 \(1\) 的累计数。此后的 \(2(n-m)-1\) 位上有 \(n-m\) 个 \(1\),\(n-m-1\) 个 \(0\). 如若把后面这部分 \(2(n-m)-1\) 位,\(0\) 与 \(1\) 交换,使之成为 \(n-m\) 个 \(0\),\(n-m-1\) 个 \(1\),结果得一个由 \(n+1\) 个 \(0\) 和 \(n-1\) 个 \(1\) 组成的 \(2n\) 位数,即一个不合要求对应于一个由 \(n-1\) 个 \(0\) 和 \(n+1\) 个 \(1\) 组成的一个排列。反过来,任何一个由 \(n+1\) 个 \(0\),\(n-1\) 个 \(1\) 组成的 \(2n\) 位数,由于 \(0\) 的个数多两个,\(2n\) 是偶数,故必在某一个奇数位上出现 \(0\) 的累计数超过 \(1\) 的累计数。同样在后面部分,令 \(0\) 和 \(1\) 互换,使之成为由 \(n\) 个 \(0\) 和 \(n\) 个 \(1\) 组成的 \(2n\) 位数。即 \(n-1\) 个 \(0\) 和 \(n+1\) 个 \(1\) 组成的 \(2n\) 位数,必对应于一个为合要求的数。

上述方法建立了由 \(n+1\) 个 \(0\) 和 \(n-1\) 个 \(1\) 组成的 \(2n\) 位数,与由 \(n\) 个 \(0\) 和 \(n\) 个 \(1\) 组成的 \(2n\) 位数中从左向右扫描出现 \(0\) 的累计数超过 \(1\) 的累计数的数一一对应。因而不合要求的 \(2n\) 位数与 \(n+1\) 个 \(0\),\(n-1\) 个 \(1\) 组成的排列一一对应 ,故有

\begin{align}
p_{2n} = C_{2n}^n - C_{2n}^{n+1} = (2n)! \left[ \frac{1}{n!n!} -\frac{1}{(n-1)!(n+1)!}\right] = \frac{(2n)!}{(n+1)!n!} = \frac{1}{n+1}C_{2n}^n = f(n+2)
\end{align}

上个问题对应下图左中从原点 \((0,0)\) 到 \((n,n)\) 点的路径要求中途所经过的点 \((a,b)\) 满足关系 \(a\leqslant b\).

对应的办法是从 \((0,0)\) 出发,对 \(2n\) 位数从左而右扫描,若遇到 \(1\) 便沿 \(y\) 轴正方向走一格;若遇到 \(0\) 便沿 \(x\) 轴正方向走一格。由于有 \(n\) 个 \(0\),\(n\) 个 \(1\),故对应一条从 \((0,0)\) 点到 \((n,n)\) 点的路径。由于要求 \(1\) 的累计数不少于 \(0\) 的累计数,故可以途经对角线 \(OA\) 上的点,但不允许穿越过对角线。反过来,满足这条件的路径对应一满足要求的 \(2n\) 位二进制数。

 
  例 2. 将例 1 中的 \(1\) 看成左括号,\(0\) 看成右括号,就变成了合法括号表达式的个数。比如两个左括号和两个右括号组成的合法表达式有 \(p_4 = f(2+2) = 2\) 种,即 \(()()\) 和 \((())\).
 
  例 3. \(n\) 个数入栈后出栈的排列总数是 \(f(n+2)\). 比如 \(1,2,3\) 的出栈顺序有 \(123,132,213,231,321\) 五种。
 
 
 
 
 

Catalan 数的更多相关文章

  1. Catalan数应用整理

    应用一: codevs 3112 二叉树计数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 一个有n个结点的二叉树总共有 ...

  2. 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

    Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...

  3. Catalan数(数论)

    Catalan数 [参考网址]http://www.cnblogs.com/gongxijun/p/3232682.html 记得当时我们队写过一个,差点超时,现在找到了公式,感觉还是挺简单的. 还要 ...

  4. Catalan数 && 【NOIP2003】出栈序列统计

    令h(1)=1, h(0)=1,catalan数满足递归式: h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0) (n>=2) =C(2n, n)/(n+1) ...

  5. Catalan数

    先看2个问题: 问题一: n个元素进栈(栈无穷大),进栈顺序为1,2,3,....n,那么有多少种出栈顺序? 先从简单的入手:n=1,当然只有1种:n=2,可以是1,2  也可以是2,1:那么有2种: ...

  6. catalan数及笔试面试里那些相关的问题(转)

    一.catalan数由来和性质 1)由来 catalan数(卡塔兰数)取自组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项 ...

  7. Catalan数推导(转载)

    Raney引理: 设整数序列A = {Ai, i=1, 2, …, N},且部分和Sk=A1+…+Ak,序列中所有的数字的和SN=1,在A的N个循环表示中,有且仅有一个序列B,满足B的任意部分和Si均 ...

  8. HDU 4828 - Grids (Catalan数)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4828 Catalan数的公式为 C[n+1] = C[n] * (4 * n + 2) / (n ...

  9. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

  10. 12个高矮不同的人,排成两排(catalan数)

    问题描述: 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 这个笔试题,很YD,因为把某个递归关系隐藏得很深. 问题分析: 我们先把这12个 ...

随机推荐

  1. java web 学习-网络资源

    [网络收集] 1. JavaWeb学习总结——JSP中的九个内置对象 2. Jsp九大内置对象以及四个作用域 他人学习汇总资源 1. http://www.cnblogs.com/xdp-gacl/t ...

  2. React 从入门到进阶之路(七)

    之前的文章我们介绍了 React 表单详解 约束性和非约束性组件 input text checkbox radio  select  textarea  以及获取表单的内容.接下来我们将介绍 Rea ...

  3. builtin_shaders-5.3.4f1学习-Unlit/Texture

    // Unlit shader. Simplest possible textured shader. // - no lighting // - no lightmap support // - n ...

  4. 如何在内网打洞使得能暴露mstsc端口

    说明: 1.目标机器Target,有全部控制权,其所处网络无法向外网暴露端口,但是已知Target的外网地址:Target_internet_addr 2.交换机器Exchange,有全部控制权,其所 ...

  5. linux命令行挂载NTFS文件系统的移动硬盘

    环境 ubuntu 12.04 桌面版 由于我的ubuntu 是安装在vmware 上,如果接入移动硬盘后,它没有办法自动识别ntfs 格式的文件系统,导致mount 盘失败 从网上找到一个方法 首先 ...

  6. 基于nginx的配置网站密码认证

    在nginx配置服务中,创建访问网站密码认证. 1)需要ngx_http_auth_basic_module模块 语法: Syntax: auth_basic string | off; Defaul ...

  7. python连接redis数据库的两种方式

    代码: # __author__ = 'STEVEN' import redis # 方式1,直接连接 # r = redis.Redis(host='192.168.43.22',port=6379 ...

  8. ecshop文章分类页面调用文章的内容

    有的时候需要用到,所以总结了一下. 打开includes/lib_article.php文件 红色部分为添加的部分 function get_cat_articles($cat_id, $page = ...

  9. Javaoo学习数组

  10. DB2中横表纵表互换

    1.列转行:创建一个如下的表drop table dwtmp.tmp_xn_lsb; create table dwtmp.tmp_xn_lsb ( year      int ,quarter   ...