卡特兰数Catalan Number

Catalan Number满足下列递推公式:

N个元素元素进栈,多少种出栈方式

考虑A、B、C、D依次进栈,那么所有的出栈顺序是下列4种情况的并集:

1)A第一个出栈。肯定是A进栈后马上出栈,剩下B、C、D的出栈顺序有h(3)种。h(0)*h(3)。

2)A第二个出栈。在A之前出栈的肯定是B,B的出栈顺序有h(1)种,剩下C、D的出栈顺序有h(2)种。h(1)*h(2)。

3)A第三个出栈。在A之前出栈的肯定是B、C,B、C的出栈顺序有h(2)种,剩下D的出栈顺序有h(1)种。h(2)*h(1)。

4)A第四个出栈。在A之前出栈的肯定是B、C、D,B、C、D的出栈顺序有h(3)种。h(3)*h(0)。

h(4)=h(0)*h(3)+h(1)*h(2)+h(2)*h(1)+h(3)*h(0)

买票找零问题

有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?

来一位持5元的顾客记为+1(使剧院多了一张5元的零钱),来一位持10元的顾客记为-1(使剧院少了一张5元的零钱)。那么购票顺序可表示一个包含n个1和n个-1的序列,要求符合条件:

对于任意的K(),都有序列的前K项和不小于0。

下面我们要证明所有不符合条件的序列跟一个包含n-1个1和n+1个-1的序列是一一对应的。

1)一个不符合条件的序列对应唯一一个包含n-1个1和n+1个-1的序列。如果一个序列不符合条件,则必然在某个奇数位K上使得前K个数中-1的个数比+1的个数多1,也就是说第K位以后(不包含K)1的个数比-1的个数多1。现在我们把第K位以后(不包含K)的1改为-1,-1改为1,则整个序列中包含n-1个1和n+1个-1。

2)一个包含n-1个1和n+1个-1的序列对应唯一一个不符合条件的序列。一个包含n-1个1和n+1个-1的序列必然在某个奇数位K上使得前K个数中-1的个数比+1的个数多1,也就是说第K位以后(不包含K)1的个数比-1的个数多1。现在我们把第K位以后(不包含K)的1改为-1,-1改为1,刚好就对应一个个不符合条件的序列。

长度为2n的序列中出现n个1和n个-1的可能情况有种,长度为2n的序列中出现n-1个1和个n+1-1的可能情况有种,所以满足条件的情况的种。

实际上可以把“找零问题”转换为“N个元素入栈,有多少种出栈顺序”的问题:来一个持5元的顾客对应入栈,来一个持10元的顾客对应出栈。

如何编程计算

使用公式(2)来计算卡待兰数列需要用递归的方法,而递归是一种计算量很大的方法,很多时候会出现重复的计算。公式(1)也可以很直接地翻译为一种递归的算法,不过也可以很容易地使用动态规划把它转换为非递归的方法----先算h(0),再算h(1),再算h(2)……复杂度为O(N)。

如果使用公式(3)就需要掌握排列组合的计算方法。

复杂度也是O(N)。

posted @ 2012-10-06 21:08  高性能golang  阅读(1556)  评论(0编辑  收藏  举报