• 面试收集卡特兰数(Catalan数)应用


    引言:有高矮不同的12个人,现在要他们对应排成两列,保证两列分别有序,且对应位置总是第一列比第二列矮,请问有多少种排列方式?

    这是蘑菇街笔试的时候一个题目,当时陷入了枚举分类的死循环中,殊不知如果知道Catalan数的概念,直接就计算出来了。catalan组合数学上的递归式定义如下,这个递归定义是欧拉在研究下面问题5时得出的一个式子,是Catalan数起源的一种说法。

    h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)=C(2n,n)-C(2n,n+1)=C(2n,n)/(n+1)

    注:在参考四中另有一种定义h(n)=h(1)*h(n-1)+h(2)*h(n-2)+…h(n-1)*h(1)=C(2n-2,n-1)-C(2n-2,n)=C(2n-2,n-1)/n,这只是个如何确定n的问题,对分析题意影响不大,下面的分析基于第一种定义。

    由上面的定义可知,有两种情况是Catalan数来算,一种是用组合的形式给出结论的,即最后能算出C(2n,n)-C(2n,n+1),如下面列举的例子1,2,3,8,其实其它几个例子也能转化成这种形式,但是不直观,其它几个例子直观上会有h(1)*h(n-1)+h(2)*h(n-2)+…h(n-1)*h(1)的形式。

    附录参考2中有一个对某些例子而言很清晰的解释。

    Catalan数有在很多场景会见到,常见的有:

    1. 直角等边三角形网络(直角边长为n)的路径问题(见参考1)—h(n-1)

    思路:在2(n-1)个位置中找出哪(n-1)步朝上(C(2n-2,n-1)),并删除超过对角线的情况C(2n-2,n),即h(n-1)=C(2n-2,n-1)-C(2n-2,n)

    2.出栈入栈问题(见参考1),栈无穷大,n个数?—h(n)

    思路:选定n个位置入栈,n个位置出栈,C(2n,n),去除出栈入栈顺序不对的C(2n,n+1),因此为h(n)=C(2n,n)-C(2n,n+1)

    3.2n个人买票找零问题(售票处无零钱,观影者一半手持5块,一半手持10块,票价5块)—h(n)

    思路同2.

    4.n矩阵相乘的括号问题h(n-1)

    思路: 分析有如下形式

       

     

    这是catalan数的形式,f(1)=1,f(2)=1,故f(n)=h(n-1)

    5.凸n边形分割成多少个三角形(见参考4)—h(n-1)

    思路,具体思路见参考4,分析同4.

    6.n个可以构造出多少种不同的二叉树—h(n)

    思路,选定一个数作为根节点,因此有:

    ,

    这也是catalan数的特征,f(0)=1,f(1)=1,f(2)=2,因此有f(n)=h(n)

    7.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?--h(n-1)

    思路:如图,由于不相交,分割的时候若A1和A2k有连线,那么左侧有2(k-1)个点,右侧有2(n-k),所以:

     

    image

    f(2)=1,f(4)=1,故f(2n)=h(n-1)

    8.有高矮不同的12个人,现在要他们对应排成两列,保证两列分别有序,且对应位置总是第一列比第二列矮,请问有多少种排列方式?

    此题在参考1中描述得非常准确


    参考1:http://blog.csdn.net/suyksuyk/article/details/4697941

    参考2:http://blog.sina.com.cn/s/blog_66f4dd01010129a7.html

    参考3:http://blog.csdn.net/wuzhekai1985/article/details/6764858?reload

    参考4:http://blog.csdn.net/muye5/article/details/7984061


  • 相关阅读:
    VUE框架的插值操作补充
    VUE框架
    VUE框架vif
    VUE框架 methods使用
    JS 计时器案例
    JS 函数
    VUE框架安装
    VUE框架的插值操作
    JS Date类型
    VUE框架的使用
  • 原文地址:https://www.cnblogs.com/obama/p/3048189.html
Copyright © 2020-2023  润新知