卡特兰数
来源:互联网 发布:美孚一号 知乎 编辑:程序博客网 时间:2024/04/29 15:26
卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
原理
应用
平衡括号
平衡括号:在一个合法的算术表达式中可以出现的括号都是平衡括号,更专业一点的说法应该是“所有的左括号和右括号可以建立一对一的对应关系,并且左括号在对应的右括号左侧”。像()(), (())(), (()())(()) 都是平衡括号,但是(()))(, ()())() 就不是平衡括号。
观察一下特点,判断所给的一个括号串是不是平衡很容易:设置一个计数器,初始值为 0,然后从左向右数,遇到左括号 +1,遇到右括号 -1,在过程中不出现负数,并且最终的计数器还是 0,那么就是平衡括号;除此之外就是非平衡括号。
现在的问题是,如果有 n 对括号,问平衡的情况有多少种?暂时可以数一下 n = 1, 2, 3, 4 时的情况:
n = 1: ()n = 2: ()(), (())n = 3: ()()(), ()(()), (())(), (()()), ((()))n = 4:()()()(), ()()(()), ()(())(), ()(()()), ()((())), (())()(), (())(()), (()())(), ((()))(), (()()()), (()(())), ((())()), ((()())), (((())))
则n对括号就有平衡括号h(n)种。
入栈出栈
问:n 个数入栈出栈,问情况有多少种?
比如全部入进去然后倒退出栈是 1 种;入一个出一个,全部都这样,是 1 种。入栈出栈的情况和n个数相不相同没有关系。因为可以视第一个入栈的为 1,第二个为 2,最后一个为 n。如果是 n 个相同的数的入栈出栈情况,假设数字都是括号,入栈是左括号,出栈是右括号,那么一种入栈出栈情况应该就对应平衡括号中的一种情况,所以,该问题和平衡括号是等价问题。
走方格
问:一个 n*n 的方格,从左下角走到右上角,只能向右和向上走,但是不能绕过左下角和右上角确定的对角线,问有多少种走法?
如果将向右走看做是入一下栈,向上走是出一下栈,不能绕道对角线以上,也就是一种合法的入栈出栈,从左下角开始到右上角,要入 n 次栈出 n 次栈,所以一种走法对应一种 n 个数的入栈出栈情况,于是,此问题和入栈出栈是等价问题;
二叉树的形状
问:n 个结点的二叉树的形状有多少种?
所谓的二叉树,就是有一个根结点,有棵左子树还有一棵右子树。n = 3: ()()(), ()(()), (())(), (()()), ((())) 时的括号匹配,me 们换个角度看这个表示:第一个成对的括号是树根,括号内部的子串和括号右边的子串依然是平衡括号串,把内部的看做是左子树,把右边的看成是右子树,比如(())()对应的是有一个左节点和一个右节点的二叉树,()()() 表示只有右子树的二叉树(右子树只有一个右结点);如果上面的对应成立(递归证明),那么二叉树的情况就和平衡括号是等价问题;