离散数学及其应用——ch7 高级计数

      在第五章学习了基本的组合计数知识后,我们终于在第七章迎来了更高级的组合计数知识,把这章介绍的内容与第五章的内容合并起来,就形成了我们的组合数学工具箱,可以解决一大堆计数问题了,在计算机编程过程中很多问题其实都可以用计数模型进行建模,那么一个好的组合计数基本功当然是必不可少的了。下面我们就来总结一下这章都讲了哪些内容吧,这章的主题是三个基本方面:(1)递归关系;(2)生成函数;(3)容斥原理。
     先来看看递归关系,递归关系定义的是一串数列{ak},它用数列的前几项来定义数列的通项。很多问题都可以用递归关系来建模,比如问一段时间后岛上兔子个数的斐波拉契数列,关心盘子移动次数的汉诺塔问题,以不同方式上楼的阶梯问题以及著名的约瑟夫问题等,都是用递归关系式来建模的。当我们得到递归关系的数学模型之后该怎么推导闭形式从而快速地得到问题的解呢?这里就涉及到一个解递归关系式的问题,有一类常见的“常系数线性递归关系”可以用系统的方法进行求解,常系数线性递归关系有两种,基本的是“常系数齐次线性递归关系”,这个概念要分解地看才能理解它的意义:“常系数”是指每一个项的系数都是常数;“齐次”是指每一项都是ai的倍数;“线性”则是指递归式是数列各项的线性组合。要解这个递归关系,首先要得到特征方程,由特征方程的根以及根的重数来得到递归关系式的通解公式,然后再用初始条件来确定通解公式中的待定系数,最后得到通解。更复杂一些的是“常系数非齐次线性递归关系”,这个关系式中存在不是ai倍数的项,该项通常是n的函数,记为F(n),因此解法就比齐次关系要麻烦一些,我们先把F(n)去掉得到相应的齐次线性递归关系,用上面介绍的方法解出其通解an(h),然后根据F(n)的形式得到特解an(p)的形式,将特解代入非齐次线性递归求得特解,由此得到非齐次线性递归关系an= an(h)+ an(p) ,然后再用初始条件去确定待定系数得到最后的解(注意通解定理的证明思路要好好掌握)。学习了线性递归关系如何解,下面我们就将递归模型和算法设计联系起来,看看计算机科学解决问题的一种基本思路——分治策略,又称为“Divide & Conquer”,也就是说,我们把一个规模为n的问题分为a个,每个问题大小变为n/b,递归地解决它们,然后再用额外的g(n)操作将这a个子问题的解合并为最终问题的解,如果用f(n)来表示当问题规模为n时的总操作次数,那么就得到公式f(n) = af(n/b) + g(n)。这个公式被称为“分治递归关系”,用分治策略设计的算法复杂度都是以这种形式表示的,如二叉查找、快速矩阵乘法和归并排序等等。因此解这个递归式存在着广泛的应用,对于这种类型的递归式,我们通常用主方法进行证明(同样地,熟练掌握主方法及其特殊情况定理的证明)。最后,书中还介绍了一个比较复杂的计算几何问题——最临近点对问题,它的算法也是用分治思想设计的。
     然后就是大名鼎鼎的“生成函数”了,生成函数似乎在离散数学中是一个非常强大的工具,堪称万能钥匙,好多问题都可以用生成函数来求解或证明,这其中甚至包含概率论(概率生成函数)。生成函数强大就强大在它将一个无穷数列{ak}表示成一个单一的形式幂级数,这个多项式的每一项都是ak乘以x的k次方,跟生成函数打交道,少不了要求闭形式,这里闭形式有两个概念要区分,一个是生成函数G(x)的闭形式,是指G(x)的表达式中不包含省略号和求和符号;另一个是ak的闭形式,这个在我们用生成函数求递归式中经常用到,二者有很大的联系,我们常常是通过求G(x)的闭形式来求ak的闭形式。从形式幂级数的角度来看,我们要熟悉生成函数的加法和乘法,特别是乘法,它和一个叫“卷积”的概念有关联。然后就是扩展的二项式系数以及由此产生的扩展二项式定理,它们在生成函数的各种应用中都扮演着重要角色(特别是解决计数问题时)。本章介绍的生成函数主要用在三个方面,首当其冲的是计数问题,什么不定方程整数解的个数、给小朋友分甜饼、自动贩卖机和凑零钱(由波利亚提出)等问题,都可以用生成函数建模求解,特别是凑零钱问题要引起重视,要考虑顺序相关和顺序无关两种情况。它的解决非常的优美,并由此引出了关于整数划分的问题。然后是解递归式的问题,我们先求G(x)的闭形式,然后由闭形式套用常用形式幂级数来求ak的闭形式。最后是组合恒等式的证明,这是除了组合证明方法之后的又一种方法。
     本章最后讨论的是容斥原理,首先是容斥原理的基本形式和证明,证明主要是通过集合论的韦恩图来阐述的,容斥原理被用来解决与有限个有限集合的并集中元素个数有关的计数问题。但它的应用并不仅仅局限于此,容斥原理还有一个变形式,用于求集合中不满足一系列性质P1,P2…Pn的元素的个数。常见的应用有埃拉托色尼素数筛选算法、求映上函数个数问题,和错位排列问题。很多数学问题都可以抽象为求映上函数个数的问题,假设m大于等于n,从m个元素的集合A到n个元素的集合B的映上函数个数公式可由容斥原理求出。它的数学模型是“将m个可区分的物体放入n个不可区分的盒子中,其中没有一个盒子为空,然后再为盒子编号1,2…n”。因此映上函数的个数等于n!S(m,n),S(m,n)为第二类Stirling数,代表将m个物体放入n个盒子,使得没有一个盒子为空时的方式数,通过这个模型又可以解决一类计数问题了。最后介绍的容斥原理应用是“错位排列”,它是指将n个元素重新排列,使得每个元素都不在它原先位置的方式数,这个模型用于解决帽子问题。现在手里多了这么多组合计数的工具,以后在算法设计的学习过程中,要善于应用这些知识解决实际问题。

你可能感兴趣的:(F,数据科学)