算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式。例如汉诺塔问题的时间复杂度递推形式为
因为递推式求解的重要性,许多算法书籍对其有专门介绍。Donald Knuth在Concrete Mathematics一书中多个章节都涉及递推式求解方法。算法导论也在第四章中专门论述的这个主题。
在这些相关论述中,主要介绍了一些启发式方法,这些方法往往需要一些特殊的技巧和灵感才能完成。
而本文将论述一种纯代数式的方法,这种方法将求解递推式转化为求解一个多项式的根和求解一组线性方程组,这样就使得整个求解过程不依赖于太多技巧,因此具有更好的易用性。
本文首先会给出两个例子:如何使用纯代数方法求解斐波那契数列和汉诺塔递推式;然后会借助线性代数论述这种方法背后的数学意义,说明线性递推式与线性方程的内在联系以及这种解法的数学原理;最后将例子中的方法推广到一般情况。
斐波那契数列大家应该很熟悉了,这里不再赘述,直接进入问题。
设斐波那契数列为由如下递推式定义的数列:
求解
首先忽略初始条件,考虑递推式
这样问题被转化为一个一元二次方程的求根问题。利用求根公式可得:
因此得到递推式的一个通解:
即其中
解得
汉诺塔的时间复杂度通常使用递归式定义,在这个例子中将使用代数方法求解其封闭形式。
汉诺塔的时间复杂度为
这里并不能直接使用例1中的方法,因为右边除了递推项外,还有一个非递推项1,用线性代数的语言说,这个线性递推式是非齐次的。
可以回想一下线性代数中求解非齐次方程组通解的方法:1)求解其齐次部分的通解。2)求其一个特解,将特解加到通解上即得非齐次方程组通解。
我们用类似的方法求解汉诺塔时间复杂度递推式。首先,忽略后面的1,则得到一个齐次线性递推式:
转化为多项式方程:
因为方程是一次多项式,我们直接得到了其解为2。因此齐次递推式的通解为
然后我们需要求得
最后我们求解常数c。
将初始条件
上面两个例子可能有些同学看的不是很明白,其中提到了一些线性代数术语。在这一章节中,我们分析上述解法的数学原理,看看递推式是如何与线性代数关联起来的。
斐波那契数列和汉诺塔递推式可以看成线性递推式的特例,下面给出线性递推式的一般定义:
我们将满足如下递推关系的递推式称为线性递推式:
其中
注意仅有递推式是不能求得
下面先考虑齐次线性递推式的求解。定理如下:
设有线性齐次递推式
360docimg_501_360docimg_502_360docimg_503_360docimg_504_360docimg_505_360docimg_506_360docimg_507_360docimg_508_360docimg_509_360docimg_510_360docimg_511_360docimg_512_360docimg_513_360docimg_514_360docimg_515_360docimg_516_360docimg_517_360docimg_518_360docimg_519_360docimg_520_ 另设多项式方程
360docimg_521_360docimg_522_360docimg_523_360docimg_524_360docimg_525_360docimg_526_360docimg_527_360docimg_528_360docimg_529_360docimg_530_360docimg_531_360docimg_532_360docimg_533_360docimg_534_360docimg_535_360docimg_536_360docimg_537_360docimg_538_360docimg_539_360docimg_540_360docimg_541_360docimg_542_360docimg_543_360docimg_544_360docimg_545_360docimg_546_360docimg_547_360docimg_548_360docimg_549_360docimg_550_360docimg_551_360docimg_552_ 的根是360docimg_553_360docimg_554_360docimg_555_360docimg_556_360docimg_557_360docimg_558_360docimg_559_360docimg_560_360docimg_561_360docimg_562_ ,我们先讨论不存在重根的情况,也就是说k个根互不相等。则
360docimg_563_360docimg_564_360docimg_565_360docimg_566_ 的通解为:360docimg_567_360docimg_568_360docimg_569_360docimg_570_360docimg_571_360docimg_572_360docimg_573_360docimg_574_360docimg_575_360docimg_576_360docimg_577_360docimg_578_360docimg_579_360docimg_580_360docimg_581_360docimg_582_360docimg_583_360docimg_584_360docimg_585_360docimg_586_360docimg_587_360docimg_588_360docimg_589_360docimg_590_ 并且对于任意的初始情况
360docimg_591_360docimg_592_360docimg_593_360docimg_594_360docimg_595_360docimg_596_360docimg_597_360docimg_598_360docimg_599_360docimg_600_360docimg_601_360docimg_602_360docimg_603_360docimg_604_360docimg_605_360docimg_606_360docimg_607_360docimg_608_360docimg_609_360docimg_610_360docimg_611_360docimg_612_360docimg_613_360docimg_614_360docimg_615_360docimg_616_ 都存在一组解
360docimg_617_360docimg_618_360docimg_619_360docimg_620_360docimg_621_360docimg_622_360docimg_623_ 使得递推式成立
要证明以上定理,主要需要证明两部分。一是证明多项式根的线性组合可以满足递推式,二是证明任意初始条件下总有解。
首先来证明
360docimg_648_360docimg_649_360docimg_650_360docimg_651_360docimg_652_360docimg_653_360docimg_654_360docimg_655_360docimg_656_360docimg_657_360docimg_658_360docimg_659_360docimg_660_360docimg_661_360docimg_662_360docimg_663_360docimg_664_360docimg_665_360docimg_666_360docimg_667_360docimg_668_360docimg_669_360docimg_670_360docimg_671_360docimg_672_360docimg_673_360docimg_674_360docimg_675_360docimg_676_360docimg_677_360docimg_678_360docimg_679_360docimg_680_360docimg_681_360docimg_682_360docimg_683_360docimg_684_360docimg_685_360docimg_686_360docimg_687_360docimg_688_360docimg_689_360docimg_690_360docimg_691_360docimg_692_360docimg_693_ 经过变换可以改写为360docimg_694_360docimg_695_360docimg_696_360docimg_697_360docimg_698_360docimg_699_360docimg_700_360docimg_701_360docimg_702_360docimg_703_360docimg_704_360docimg_705_360docimg_706_360docimg_707_360docimg_708_360docimg_709_360docimg_710_360docimg_711_360docimg_712_360docimg_713_360docimg_714_360docimg_715_360docimg_716_360docimg_717_360docimg_718_360docimg_719_360docimg_720_360docimg_721_360docimg_722_360docimg_723_360docimg_724_360docimg_725_360docimg_726_360docimg_727_360docimg_728_360docimg_729_360docimg_730_360docimg_731_360docimg_732_360docimg_733_360docimg_734_360docimg_735_360docimg_736_360docimg_737_360docimg_738_360docimg_739_360docimg_740_360docimg_741_ 假设
360docimg_742_360docimg_743_360docimg_744_360docimg_745_360docimg_746_360docimg_747_360docimg_748_ ,因为360docimg_749_360docimg_750_360docimg_751_ ,所以两边除以360docimg_752_360docimg_753_360docimg_754_360docimg_755_ ,得到360docimg_756_360docimg_757_360docimg_758_360docimg_759_360docimg_760_360docimg_761_360docimg_762_360docimg_763_360docimg_764_360docimg_765_360docimg_766_360docimg_767_360docimg_768_360docimg_769_360docimg_770_360docimg_771_360docimg_772_360docimg_773_360docimg_774_360docimg_775_360docimg_776_360docimg_777_ 因此这个多项式和原递推式同解,因此多项式的每个根q的几何级数
360docimg_778_360docimg_779_ 都是原递推式的一个解。同时,根的线性组合360docimg_780_360docimg_781_360docimg_782_360docimg_783_360docimg_784_360docimg_785_360docimg_786_360docimg_787_360docimg_788_360docimg_789_360docimg_790_360docimg_791_360docimg_792_360docimg_793_360docimg_794_360docimg_795_360docimg_796_360docimg_797_360docimg_798_ 均满足原递推式(可以带入验证)。
下面要证明对于任意初始条件,均存在适当的常数
将
360docimg_806_360docimg_807_360docimg_808_360docimg_809_360docimg_810_360docimg_811_360docimg_812_360docimg_813_360docimg_814_360docimg_815_360docimg_816_360docimg_817_360docimg_818_360docimg_819_360docimg_820_360docimg_821_360docimg_822_360docimg_823_360docimg_824_360docimg_825_360docimg_826_360docimg_827_360docimg_828_360docimg_829_360docimg_830_360docimg_831_ 带入通解公式,得到一个线性方程组
360docimg_832_360docimg_833_360docimg_834_360docimg_835_360docimg_836_360docimg_837_360docimg_838_360docimg_839_360docimg_840_360docimg_841_360docimg_842_360docimg_843_360docimg_844_360docimg_845_360docimg_846_360docimg_847_360docimg_848_360docimg_849_360docimg_850_360docimg_851_360docimg_852_360docimg_853_360docimg_854_360docimg_855_360docimg_856_360docimg_857_360docimg_858_360docimg_859_360docimg_860_360docimg_861_360docimg_862_360docimg_863_360docimg_864_360docimg_865_360docimg_866_360docimg_867_360docimg_868_360docimg_869_360docimg_870_360docimg_871_360docimg_872_360docimg_873_360docimg_874_360docimg_875_360docimg_876_360docimg_877_360docimg_878_360docimg_879_360docimg_880_360docimg_881_360docimg_882_360docimg_883_360docimg_884_360docimg_885_360docimg_886_360docimg_887_360docimg_888_360docimg_889_360docimg_890_360docimg_891_360docimg_892_360docimg_893_360docimg_894_360docimg_895_360docimg_896_360docimg_897_360docimg_898_360docimg_899_360docimg_900_360docimg_901_360docimg_902_360docimg_903_360docimg_904_360docimg_905_360docimg_906_360docimg_907_360docimg_908_360docimg_909_360docimg_910_360docimg_911_360docimg_912_360docimg_913_360docimg_914_360docimg_915_360docimg_916_ 此时问题转化为证明此方程组对于必然有解,下面就要用到线性代数的知识了。这个方程组的系数行列式为:
360docimg_917_360docimg_918_360docimg_919_360docimg_920_360docimg_921_360docimg_922_360docimg_923_360docimg_924_360docimg_925_360docimg_926_360docimg_927_360docimg_928_360docimg_929_360docimg_930_360docimg_931_360docimg_932_360docimg_933_360docimg_934_360docimg_935_360docimg_936_360docimg_937_360docimg_938_360docimg_939_360docimg_940_360docimg_941_360docimg_942_360docimg_943_360docimg_944_360docimg_945_360docimg_946_360docimg_947_360docimg_948_360docimg_949_360docimg_950_360docimg_951_360docimg_952_360docimg_953_360docimg_954_360docimg_955_360docimg_956_360docimg_957_360docimg_958_360docimg_959_360docimg_960_360docimg_961_360docimg_962_360docimg_963_360docimg_964_360docimg_965_360docimg_966_360docimg_967_360docimg_968_360docimg_969_360docimg_970_360docimg_971_360docimg_972_360docimg_973_360docimg_974_360docimg_975_360docimg_976_360docimg_977_360docimg_978_360docimg_979_360docimg_980_ 这个行列式就是非常著名Vandermonde行列式,所以
360docimg_981_360docimg_982_360docimg_983_360docimg_984_360docimg_985_360docimg_986_360docimg_987_360docimg_988_360docimg_989_360docimg_990_360docimg_991_360docimg_992_360docimg_993_360docimg_994_360docimg_995_360docimg_996_360docimg_997_360docimg_998_360docimg_999_360docimg_1000_360docimg_1001_360docimg_1002_ 上面我们假设了多项式各个根均互异,因此行列式的值不等于0,这意味着系数矩阵的秩为k。有线性代数知识可知,这表明对于任意初始值
360docimg_1003_360docimg_1004_360docimg_1005_360docimg_1006_360docimg_1007_360docimg_1008_360docimg_1009_360docimg_1010_360docimg_1011_ ,方程组均有唯一解。证毕。
顺便说一下,上面的多项式叫特征多项式。其根叫特征根。
通过上面的数学分析,我们得到了一个解线性递推式的通用方法。
设有齐次递推式
我们可以写出其特征多项式方程
解出其k个根
然后将初始条件
解线性方程组得唯一解
对于非齐次递推式
可以首先按上面的方法求解其齐次部分的通解
然后用同样的方法带入初始值,通过线性方程组求出个常量参数带回即可(具体可参见例2)。
上面的解法只针对特征根互异,如果有重根的话,则上述方法会无效。不过只要经过一定处理也可以有通用方法求解,因有点复杂,本文不在针对重根情况进行叙述。关于重根情况下的求解,有感兴趣的同学可以参考线性代数或微分方程相关文献。
联系客服