zoukankan      html  css  js  c++  java
  • 组合数学及其应用——递推关系和生成函数

      将计数结果或者某个特殊数列的信息,呈现在一个函数关系式中,我们称之为生成函数,如这个名字,我们本质上讨论的是一个函数解析式,但是这个解析式以一个无穷级数的形式蕴藏着某个计数数列。

                               

      目前来看对于给出的这个“生成函数”的新定义,我们似乎看不到有什么很好的用处,但是随着问题的深入,它的作用便会呈现出来,例如在求解Catalan数的非齐次递推关系的时候就用到了生成函数的概念。

      例子1:

       

      在一些问题中,我们借助生成函数的概念,通过其他的运算定理,将一个∑形式的生成函数转化成其他的形式然后进行函数层次上的操作,能够使得我们处理问题站在一个新的视角。

      例子2:

       

      例子3:

      什么样的数列的生成函数是如下式子?

       

      例子4:确定苹果、香蕉、橘子和梨的n组合个数,其中每个n组合苹果的个数是偶数,香蕉的个数是奇数,橘子的个数是0到4之间,而且至少有一个梨.

       

      例子5:

      求装有苹果、香蕉、橘子和梨的果篮的可能数h(n),其中每个果篮中苹果数是偶数,香蕉数是5的倍数,橘子树最多有4个,而梨的个数是0或1.

       

                                 

       这种形式虽然给出了线性递推关系,但是各项系数不全为常数,下面我们引入一种求解线性常系数递推关系的通解求法。

      

     

      这一定理的作用在于:能够将需要O(n)时间复杂度求解的的数列,在O(logn)得到。

      Ex2:

      一串由a、b、c组成的通信文字的长度为n,要求通信文字中不能够有连续两个a出现,那么请问共有多少种情况?

     

      呼应其一开始我们给出的结论:求解递推关系为了更快的计算序列中的某项h[n],对比1、2两个例题我们发现,如果就编程计算而言,Ex1用这种方法是很好的,因为最终的形式比较的简单不含根号。而Ex2的形式如果交给计算机计算,就显得有些丑陋。例如斐波那契数列,利用该定理求得的解也带有根号,此时为了简化求得数列中某一项的时间复杂度,我们就要去寻求其他的方法(例如矩阵快速幂)。

  • 相关阅读:
    Iterator与 Enumeration
    多态性理解
    django---路由层
    django常用模块汇总
    django初识
    python常见模块
    python PEP8规范
    logging模块
    mysql一些了解的名词
    python 链接 mysql数据库
  • 原文地址:https://www.cnblogs.com/rhythmic/p/6124323.html
Copyright © 2011-2022 走看看