将计数结果或者某个特殊数列的信息,呈现在一个函数关系式中,我们称之为生成函数,如这个名字,我们本质上讨论的是一个函数解析式,但是这个解析式以一个无穷级数的形式蕴藏着某个计数数列。
目前来看对于给出的这个“生成函数”的新定义,我们似乎看不到有什么很好的用处,但是随着问题的深入,它的作用便会呈现出来,例如在求解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的形式如果交给计算机计算,就显得有些丑陋。例如斐波那契数列,利用该定理求得的解也带有根号,此时为了简化求得数列中某一项的时间复杂度,我们就要去寻求其他的方法(例如矩阵快速幂)。