出栈序列统计

来源:互联网 发布:如何学英语 知乎 编辑:程序博客网 时间:2024/04/20 10:08
栈是一种常见的数据结构,有许多关于栈的问题,其中之一就是统计元素可能的出栈序列。具体说,就是给定n个元素,依次通过一个栈,求可能的出栈序列的个数。
如果我们用直接模拟的方法,当n较大时会很费时间;另一种方法是利用组合数学求出栈序列个数,得到公式 
出栈序列统计 - Black - 小聪拌逗腐
        下面我们来看一种图形化的方法证明这个等式,很容易理解的。
        我们把对n个元素的n次进栈和n次出栈理解为在一个n * n的方格中向右走n次(代表进栈),向上走n次(代表出栈)。由于出栈次数不能大于进栈次数,我们可以得到这样一个方格:
出栈序列统计 - Black - 小聪拌逗腐
        每次沿着实线走,所以,只要求出从方格左下角到右上角路径的个数即可。
        我们把表格补全,考虑每一条不合法的路径,如
出栈序列统计 - Black - 小聪拌逗腐
        在这条路径上,必然有一个地方连续两次向上,即从图上蓝点处开始,而且这个点必然在如图所示的绿线上。我们以这个点为起点,把到左上角整条路经取反,也就是对称上去,得到一条新路径,但是超出了表格。我们知道,这条路径包括n + 1次向上和n – 1次向下,也就是在一个(n + 1) * (n - 1)的方格中。由此我们知道,一条不合法路径必然对应一个(n + 1) * (n - 1)方格中的路径。同样地,对于(n + 1) * (n - 1)方格中任意一条路径,以这条路径与绿线的第一个交点为起点到方格的右上方全部取反,即可得到一个在n * n方格中的不合法路径。
出栈序列统计 - Black - 小聪拌逗腐
        我们通过这样的方法确定了每条不合法路径与一个(n + 1) * (n - 1)方格中路径的一一对应关系,因此,方格中不合法路径总数为C(2n, n - 1),而所有路径总数为C(2n, n),两式相减即为原组合等式。
0 0
原创粉丝点击