zoukankan      html  css  js  c++  java
  • n对括号的匹配方式以及Catalan数通项公式的推导

    4对括号有多少种可能的合法匹配方式?n对括号呢?

    此题是卡特兰数的一个通常应用,相似的还有出栈顺序等。关于卡特兰数的具体内容,请参阅百度百科或Wiki.
     
    网络上可以搜到很多相关的题目和解答,但是鲜有易懂的推导过程。这里记录一种推导过程如下:
     
    结论:对于n对括号,合法的排列共有C(n,2n) - C(n+1,2n)种.
    分析:
    1.考虑n对括号,共有n个 ( 和n个)。
    对于其全排列,可以看做是2n个空,将n个 ( 放入其中任意n个空中, 剩余的位置由 ) 填充,显然其全排列的个数为
     C(n,2n)
    2.在全排列中,包含一部分非法的排列,我们从中减去非法的排列个数,即可得到合法的排列数目。问题规模被缩小。考虑所有排列中,非法排列的个数。
    3.先来观察非法排列的特性,我们假设(为1,)为-1,对于任意一个非法排列a1,a2 ... an ,比存在一个k,使得
               a1+a2+a3..ak<0
       因为如果这个和小于0,说明到k位置-1出现的次数比1多,即右括号出现的次数比左括号多,即该组合是非法的。
    4. 对于一个非法排列,必存在一个k,使得a1+a2+a3..ak<0,给出一个n=3时具体的排列:
               1, -1, 1, -1,-1, 1
       在k=5时,出现了非法情况。
       我们将1~5元素翻转,即1和-1置换,那么该序列就变成了
               -1, 1, -1, 1, 1, 1
       这个翻转的序列中,有n+1个1,n-1个-1
       我们再观察这个翻转后的序列,对于有n+1个1,n-1个-1的排列,共有C(n+1,2n)种。而对于这种非法的排列:
     总是存在一个最小的k,我们只需要从第1个到第k个元素翻转回去,就能变成对于有n个1,n个-1的情况下的非法排列。同样,每一个n个1,n个-1的情况下的非法排列也会对应一个n+1个1,n-1个-1的排列。
     
       例如:
            1, 1, 1, 1, -1, -1 --->从k=1翻转 -1,1,1,1,-1,-1 
            -1, 1, 1, 1, 1, -1 --->从k=2翻转 1,-1,-1,1,1,-1
    (这里不是很容易理解,需要自己画图分析)
    5.所以可以推得,非法排列的个数为C(n+1,2n),
    6.最终可得结论:对于n对括号,合法的排列共有C(n,2n) - C(n+1,2n)种.
  • 相关阅读:
    vector在堆上还是在栈上(等待自己慢慢领悟吧)
    函数指针遇到typedef
    回调函数的代码示例
    _T和_L的区别
    MFC打开文件夹对话框
    C++中的抽象类和接口类
    UML图中继承和实现的区别
    扩展点(ExtensionPoint)
    组播(又称多播)是个好东西
    C++代码实现组播及归纳的流程图
  • 原文地址:https://www.cnblogs.com/suijie/p/3989352.html
Copyright © 2011-2022 走看看