数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
楼主: b

算法的复杂性

[复制链接]
b
 楼主| 发表于 2004-5-29 03:26:27 | 显示全部楼层
<>其中<I>T</I>(<I>m</I>)是当问题的规模<I>U</I>-<I>L</I>+1=<I>m</I>时b_search在最坏情况下(这时,数组A[<I>L</I>..<I>U</I>]中没有给定的<I>C</I>)的时间复杂性。根据规则(l)-(8),我们有:</P>
<><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img16.gif"></P>
<>或化简为</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img19.gif"></P>
<P>这是一个关于T(m)的递归方程。用下一段将介绍的迭代法,容易解得:</P>
<P><I>T</I>(<I>m</I>)=11log<I>m </I>+l3=<I>θ</I>(log<I>m</I>)</P>
<P>在结束这一段之前,我们要提一下关于算法在最坏情况下的空间复杂性分析。我们照样可以给出与分析时间复杂性类似的规则。这里不赘述。然而应该指出,在出现过程(或函数)递归调用时要考虑到其中隐含的存储空间的额外开销。因为现有的实现过程(或函数)递归调用的编程技术需要一个隐含的、额外(即不出现在程序的说明中)的栈来支持。过程(或函数)的递归调用每深人一层就把本层的现场局部信息及调用的返回地址存放在栈顶备用,直到调用的最里层。因此递归调用一个过程(或函数)所需要的额外存储空间的大小即栈的规模与递归调用的深度成正比,其比例因子等于每深入一层需要保存的数据量。比如本段前面所举的递归函数b_search,在最坏情况下,递归调用的深度为log<I>m</I>,因而在最坏情况下调用它所需要的额外存储空间为<I>θ</I>(log<I>m</I>)。</P><!-- #EndEditable -->
b
 楼主| 发表于 2004-5-29 03:27:13 | 显示全部楼层
<H2>递归方程解的渐近阶的求法</H2><>上一章所介绍的递归算法在最坏情况下的时间复杂性渐近阶的分析,都转化为求相应的一个递归方程的解的渐近阶。因此,求递归方程的解的渐近阶是对递归算法进行分析的关键步骤。 <>递归方程的形式多种多样,求其解的渐近阶的方法也多种多样。这里只介绍比较实用的五种方法。 <OL><LI><B><a href="http://algorithm.myrice.com/algorithm/complexity/chapter6_1.htm" target="_blank" >代入法</A> </B>这个方法的基本步骤是先推测递归方程的显式解,然后用数学归纳法证明这一推测的正确性。那么,显式解的渐近阶即为所求。 <LI><B><a href="http://algorithm.myrice.com/algorithm/complexity/chapter6_2.htm" target="_blank" >迭代法</A></B>  这个方法的基本步骤是通过反复迭代,将递归方程的右端变换成一个级数,然后求级数的和,再估计和的渐近阶;或者,不求级数的和而直接估计级数的渐近阶,从而达到对递归方程解的渐近阶的估计。 <LI><B><a href="http://algorithm.myrice.com/algorithm/complexity/chapter6_3.htm" target="_blank" >套用公式法</A> </B>这个方法针对形如:<I>T </I>(<I>n</I>)<I>=aT </I>(<I>n </I>/ <I>b</I>)+<I>f </I>(<I>n</I>) 的递归方程,给出三种情况下方程解的渐近阶的三个相应估计公式供套用。 <LI><B><a href="http://algorithm.myrice.com/algorithm/complexity/chapter6_4.htm" target="_blank" >差分方程法</A></B>  有些递归方程可以看成一个差分方程,因而可以用解差分方程(初值问题)的方法来解递归方程。然后对得到的解作渐近阶的估计。 <LI><B><a href="http://algorithm.myrice.com/algorithm/complexity/chapter6_5.htm" target="_blank" >母函数法</A> </B>这是一个有广泛适用性的方法。它不仅可以用来求解线性常系数高阶齐次和非齐次的递归方程,而且可以用来求解线性变系数高阶齐次和非齐次的递归方程,甚至可以用来求解非线性递归方程。方法的基本思想是设定递归方程解的母函数,努力建立一个关于母函数的可解方程,将其解出,然后返回递归方程的解。 </LI></OL><>本章将逐一地介绍上述五种井法,并分别举例加以说明。 <P>本来,递归方程都带有初始条件,为了简明起见,我们在下面的讨论中略去这些初始条件。</P>
b
 楼主| 发表于 2004-5-29 03:28:22 | 显示全部楼层
<H3>递归方程组解的渐进阶的求法——代入法</H3>
<>用这个办法既可估计上界也可估计下界。如前面所指出,方法的关键步骤在于预先对解答作出推测,然后用数学归纳法证明推测的正确性。</P>
<>例如,我们要估计T(n)的上界,T(n)满足递归方程:</P>
<><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img115.gif"></P>
<P>其中<IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img109.gif">是地板(floors)函数的记号,<IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img113.gif">表示不大于n的最大整数。</P>
<P>我们推测T(n)=O(n<I>log </I>n),即推测存在正的常数C和自然数n<SUB>0</SUB>,使得当n≥n<SUB>0</SUB>时有:</P>
<P><I>T</I>(<I>n</I>)≤<I>Cn</I>log <I>n</I> (6.2)</P>
<P>事实上,取<I>n</I><SUB>0</SUB>=2<SUP>2</SUP>=4,并取</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img76.gif"></P>
<P>那么,当<I>n</I><SUB>0</SUB>≤<I>n</I>≤2<I>n</I><SUB>0</SUB>时,(6.2)成立。今归纳假设当2<I><SUP>k</SUP></I><SUP>-1</SUP><I>n</I><SUB>0</SUB>≤<I>n</I>≤2<I><SUP>k</SUP>n</I><SUB>0</SUB> ,<I>k</I>≥1时,(1.1.16)成立。那么,当2<I><SUP>k</SUP>n</I><SUB>0</SUB>≤<I>n</I>≤2<I><SUP>k</SUP></I><SUP>+1</SUP><I>n</I><SUB>0</SUB>时,我们有:</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img114.gif"></P>
<P>即(6.2)仍然成立,于是对所有<I>n</I>≥<I>n</I><SUB>0</SUB>,(6.2)成立。可见我们的推测是正确的。因而得出结论:递归方程(6.1)的解的渐近阶为<I>O</I>(<I>n</I>log<I>n</I>)。</P>
<P>这个方法的局限性在于它只适合容易推测出答案的递归方程或善于进行推测的高手。推测递归方程的正确解,没有一般的方法,得靠经验的积累和洞察力。我们在这里提三点建议:</P>
<P>(1) 如果一个递归方程类似于你从前见过的已知其解的方程,那么推测它有类似的解是合理的。作为例子,考虑递归方程:</P>
<P><I><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img116.gif"></I></P>
<P>右边项的变元中加了一个数17,使得方程看起来难于推测。但是它在形式上与(6.1)很类似。实际上,当n充分大时</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img117.gif">与<IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img118.gif"></P>
<P>相差无几。因此可以推测(6.3)与(6.1)有类似的上界<I>T</I>(<I>n</I>)=<I>O</I>(<I>n</I>log<I>n</I>)。进一步,数学归纳将证明此推测是正确的。</P>
<P>(2)从较宽松的界开始推测,逐步逼近精确界。比如对于递归方程(6.1),要估计其解的渐近下界。由于明显地有<I>T</I>(<I>n</I>)≥<I>n</I>,我们可以从推测<I>T</I>(<I>n</I>)=<I>Ω</I>(<I>n</I>)开始,发现太松后,把推测的阶往上提,就可以得到<I>T</I>(<I>n</I>)=<I>Ω</I>(<I>n</I>log <I>n</I>)的精确估计。</P>
<P>(3)作变元的替换有时会使一个末知其解的递归方程变成类似于你曾见过的已知其解的方程,从而使得只要将变换后的方程的正确解的变元作逆变换,便可得到所需要的解。例如考虑递归方程:</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img119.gif"></P>
<P>看起来很复杂,因为右端变元中带根号。但是,如果作变元替换<I>m</I>=log<I>n</I>,即令<I>n</I>=2<I><SUP>m</SUP></I><SUP> </SUP>,将其代入(6.4),则(6.4)变成:</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img99.gif"></P>
<P>把<I>m</I>限制在正偶数集上,则(6.5)又可改写为:</P>
<P><I>T</I>(2<I><SUP>m</SUP></I>)=2<I>T</I>(2<I><SUP>m</SUP></I><SUP>/2</SUP>)+<I>m</I></P>
<P>若令<I>S</I>(<I>m</I>)=<I>T</I>(2<I><SUP>m</SUP></I>),则<I>S</I>(<I>m</I>)满足的递归方程:</P>
<P><I>S</I>(<I>m</I>)=2<I>S</I>(<I>m</I>/2)+<I>m</I> ,</P>
<P>与(6.1)类似,因而有:</P>
<P><I>S</I>(<I>m</I>)=<I>O</I>(<I>m</I>1og<I> m</I>),</P>
<P>进而得到<I>T</I>(<I>n</I>)=<I>T</I>(2<I><SUP>m</SUP></I>)=<I>S</I>(<I>m</I>)=<I>O</I>(<I>m</I>1og<I>m</I>)=<I>O</I>(log<I>n</I>loglog<I>n</I>) (6.6)</P>
<P>上面的论证只能表明:当(充分大的)<I>n</I>是2的正偶次幂或换句话说是4的正整数次幂时(6.6)才成立。进一步的分析表明(6.6)对所有充分大的正整数<I>n</I>都成立,从而,递归方程(6.4)解的渐近阶得到估计。</P>
<P>在使用代入法时,有三点要提醒:</P>
<P>(1)记号<I>O</I>不能滥用。比如,在估计(6.1)解的上界时,有人可能会推测<I>T</I>(<I>n</I>)=<I>O</I>(<I>n</I>),即对于充分大的<I>n</I>,有<I>T</I>(<I>n</I>)≤<I>Cn</I> ,其中<I>C</I>是确定的正的常数。他进一步运用数学归纳法,推出:</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img100.gif"></P>
<P>从而认为推测<I>T</I>(<I>n</I>)=<I>O</I>(<I>n</I>)是正确的。实际上,这个推测是错误的,原因是他滥用了记号<I>O</I> ,错误地把(<I>C+</I>l)<I>n</I>与<I>Cn</I>等同起来。</P>
<P>(2)当对递归方程解的渐近阶的推测无可非议,但用数学归纳法去论证又通不过时,不妨在原有推测的基础上减去一个低阶项再试试。作为一个例子,考虑递归方程</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img101.gif"></P>
<P>其中<IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img102.gif">是天花板(floors)函数的记号。我们推测解的渐近上界为<I>O</I>(<I>n</I>)。我们要设法证明对于适当选择的正常数<I>C</I>和自然数<I>n</I><SUB>0</SUB>,当<I>n</I>≥<I>n</I><SUB>0</SUB>时有<I>T</I>(<I>n</I>)≤<I>Cn</I>。把我们的推测代入递归方程,得到:</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img103.gif"></P>
<P>我们不能由此推断<I>T</I>(<I>n</I>)≤<I>Cn</I>,归纳法碰到障碍。原因在于(6.8)的右端比<I>Cn</I>多出一个低阶常量。为了抵消这一低阶量,我们可在原推测中减去一个待定的低阶量<I>b</I>,即修改原来的推测为<I>T</I>(<I>n</I>)≤<I>Cn</I>-<I>b</I> 。现在将它代人(6.7),得到:</P>
<P><IMG src="http://algorithm.myrice.com/algorithm/complexity/images/img104.gif"></P>
<P>只要<I>b</I>≥1,新的推测在归纳法中将得到通过。</P>
<P>(3)因为我们要估计的是递归方程解的渐近阶,所以不必要求所作的推测对递归方程的初始条件(如<I>T</I>(0)、<I>T</I>(1))成立,而只要对<I>T</I>(<I>n</I>)成立,其中<I>n</I>充分大。比如,我们推测(6.1)的解<I>T</I>(<I>n</I>)≤<I>Cn</I>log<I>n</I>,而且已被证明是正确的,但是当<I>n</I>=l时,这个推测却不成立,因为(<I>Cn</I>log<I>n</I>)|<SUB>n=1</SUB>=0而<I>T</I>(l)&gt;0。</P><!-- #EndEditable -->
b
 楼主| 发表于 2004-5-29 03:29:38 | 显示全部楼层
<H3>递归方程组解的渐进阶的求法——迭代法</H3><>用这个方法估计递归方程解的渐近阶不要求推测解的渐近表达式,但要求较多的代数运算。方法的思想是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。</P><>作为一个例子,考虑递归方程:</P><><img src="http://algorithm.myrice.com/algorithm/complexity/images/img105.gif"></P><P>接连迭代二次可将右端项展开为:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img106.gif"></P><P>由于对地板函数有恒等式:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img107.gif"></P><P>(6.10)式可化简为:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img108.gif"></P><P>这仍然是一个递归方程,右端项还应该继续展开。容易看出,迭代 <I>i</I> 次后,将有</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img110.gif"> (6.11)</P><P>而且当</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img111.gif"></P><P>时,(6.11)不再是递归方程。这时:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img112.gif"> (6.13)</P><P>又因为[<I>a</I>]≤<I>a</I>,由(6.13)可得:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img75.gif"></P><P>而由(6.12),知<I>i</I>≤log<SUB>4</SUB><I>n</I> ,从而</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img97.gif">,</P><P>代人(6.14)得:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img77.gif"></P><P>即方程(6.9)的解  <I>T</I>(n)=<I>O</I>(<I>n</I>)。</P><P>从这个例子可见迭代法导致繁杂的代数运算。但认真观察一下,要点在于确定达到初始条件的迭代次数和抓住每次迭代产生出来的"自由项"(与<I>T</I>无关的项)遵循的规律。顺便指出,迭代法的前几步迭代的结果常常能启发我们给出递归方程解的渐近阶的正确推测。这时若换用代入法,将可免去上述繁杂的代数运算。</P><P align=center><img src="http://algorithm.myrice.com/algorithm/complexity/images/img17.gif"></P><P align=center>图6-1 与方程(6.15)相应的递归树</P><P>为了使迭代法的步骤直观简明、图表化,我们引入<DFN>递归树</DFN>。靠着递归树,人们可以很快地得到递归方程解的渐近阶。它对描述分治算法的递归方程特别有效。我们以递归方程</P><P><I>T</I>(<I>n</I>)=2<I>T</I>(<I>n</I>/2)+<I>n</I><SUP>2</SUP> (6.15)</P><P>为例加以说明。图6-1展示出(6.15)在迭代过程中递归树的演变。为了方便,我们假设<I>n</I>恰好是2的幂。在这里,递归树是一棵二叉树,因为(6.15)右端的递归项2<I>T</I>(<I>n</I>/2)可看成<I>T</I>(<I>n</I>/2)+<I>T</I>(<I>n</I>/2)。图6-1(a)表示<I>T</I>(<I>n</I>)集中在递归树的根处,(b)表示<I>T</I>(<I>n</I>)已按(6.15)展开。也就是将组成它的自由项<I>n</I><SUP>2</SUP>留在原处,而将2个递归项<I>T</I>(<I>n</I>/2)分别摊给它的2个儿子结点。(c)表示迭代被执行一次。图6-1(d)展示出迭代的最终结果。</P>
b
 楼主| 发表于 2004-5-29 03:29:50 | 显示全部楼层
<>图6-1中的每一棵递归树的所有结点的值之和都等于<I>T</I>(<I>n</I>)。特别,已不含递归项的递归树(d)中所有结点的值之和亦然。我们的目的是估计这个和<I>T</I>(<I>n</I>)。我们看到有一个表格化的办法:先按横向求出每层结点的值之和,并记录在各相应层右端顶格处,然后从根到叶逐层地将顶格处的结果加起来便是我们要求的结果。照此,我们得到(6.15)解的渐近阶为<I>θ</I>(<I>n</I><SUP>2</SUP>)。</P><>再举一个例子。递归方程:</P><><I>T</I>(<I>n</I>)=<I> T</I>(<I>n</I>/3)+<I> T</I>(2<I>n</I>/3)+<I>n</I> (6.16)</P><P>的迭代过程相应的递归树如图6-2所示。其中,为了简明,再一次略去地板函数和天花板函数。</P><P align=center><img src="http://algorithm.myrice.com/algorithm/complexity/images/img20.gif"></P><P align=center>图6-2迭代法解(6.16)的递归树</P><P>当我们累计递归树各层的值时,得到每一层的和都等于<I>n</I>,从根到叶的最长路径是</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img22.gif"></P><P>设最长路径的长度为<I>k</I>,则应该有</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img24.gif">,</P><P>得</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img26.gif">,</P><P>于是</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img27.gif"></P><P>即<I>T</I>(<I>n</I>)=<I>O</I>(<I>n</I>log<I>n</I>) 。</P><P>以上两个例子表明,借助于递归树,迭代法变得十分简单易行。</P>
b
 楼主| 发表于 2004-5-29 03:30:06 | 显示全部楼层
<H3>递归方程组解的渐进阶的求法——套用公式法</H3><>这个方法为估计形如:</P><><I>T</I>(<I>n</I>)=<I>aT</I>(<I>n</I>/<I>b</I>)+<I>f</I>(<I>n</I>) (6.17)</P><>的递归方程解的渐近阶提供三个可套用的公式。(6.17)中的<I>a</I>≥1和<I>b</I>≥1是常数,<I>f</I> (<I>n</I>)是一个确定的正函数。</P><P>(6.17)是一类分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为<I>n</I>/<I>b</I>的<I>a</I>个子间题,递归地求解这<I>a</I>个子问题,然后通过对这<I>a</I>个子间题的解的综合,得到原问题的解。如果用<I>T</I>(<I>n</I>)表示规模为<I>n</I>的原问题的复杂性,用<I>f</I>(<I>n</I>)表示把原问题分成<I>a</I>个子问题和将<I>a</I>个子问题的解综合为原问题的解所需要的时间,我们便有方程(6.17)。</P><P>这个方法依据的是如下的定理:设<I>a</I>≥1和<I>b</I>≥1是常数<I>f</I> (<I>n</I>)是定义在非负整数上的一个确定的非负函数。又设<I>T</I>(<I>n</I>)也是定义在非负整数上的一个非负函数,且满足递归方程(6.17)。方程(6.17)中的<I>n</I>/<I>b</I>可以是[<I>n</I>/<I>b</I>],也可以是<I>n</I>/<I>b</I>。那么,在<I>f</I>(<I>n</I>)的三类情况下,我们有<I>T</I>(<I>n</I>)的渐近估计式:</P><OL><LI>若对于某常数<I>ε</I>&gt;0,有
<img src="http://algorithm.myrice.com/algorithm/complexity/images/img28.gif">,

<img src="http://algorithm.myrice.com/algorithm/complexity/images/img29.gif">; <LI>若
<img src="http://algorithm.myrice.com/algorithm/complexity/images/img30.gif">,

<img src="http://algorithm.myrice.com/algorithm/complexity/images/img31.gif">; <LI>若对其常数<I>ε</I>&gt;0,有
<img src="http://algorithm.myrice.com/algorithm/complexity/images/img32.gif">
且对于某常数<I>c</I>&gt;1和所有充分大的正整数<I>n</I>有<I>af</I>(<I>n</I>/<I>b</I>)≤<I>cf</I>(<I>n</I>),则<I>T</I>(<I>n</I>)=<I>θ</I>(<I>f</I>(<I>n</I>))。 </LI></OL><P>这里省略定理的证明。</P><P>在应用这个定理到一些实例之前,让我们先指出定理的直观含义,以帮助读者理解这个定理。读者可能已经注意到,这里涉及的三类情况,都是拿<I>f</I>(<I>n</I>)与<img src="http://algorithm.myrice.com/algorithm/complexity/images/img33.gif">作比较。定理直观地告诉我们,递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数<img src="http://algorithm.myrice.com/algorithm/complexity/images/img34.gif">较大,则<I>T</I>(<I>n</I>)=<I>θ</I>(<img src="http://algorithm.myrice.com/algorithm/complexity/images/img35.gif">);在第三类情况下,函数<I>f</I>(<I>n</I>)较大,则<I>T</I>(<I>n</I>)=<I>θ</I>(<I>f</I> (<I>n</I>));在第二类情况下,两个函数一样大,则<I>T</I>(<I>n</I>)=<I>θ</I>(<img src="http://algorithm.myrice.com/algorithm/complexity/images/img36.gif">),即以<I>n</I>的对数作为因子乘上<I>f</I>(<I>n</I>)与<I>T</I>(<I>n</I>)的同阶。</P><P>此外,定理中的一些细节不能忽视。在第一类情况下<I>f</I>(<I>n</I>)不仅必须比<img src="http://algorithm.myrice.com/algorithm/complexity/images/img37.gif">小,而且必须是多项式地比<img src="http://algorithm.myrice.com/algorithm/complexity/images/img38.gif">小,即<I>f</I>(<I>n</I>)必须渐近地小于<img src="http://algorithm.myrice.com/algorithm/complexity/images/img39.gif">与<img src="http://algorithm.myrice.com/algorithm/complexity/images/img40.gif">的积,<I>ε</I>是一个正的常数;在第三类情况下<I>f</I>(<I>n</I>)不仅必须比<img src="http://algorithm.myrice.com/algorithm/complexity/images/img41.gif">大,而且必须是多项式地比<img src="http://algorithm.myrice.com/algorithm/complexity/images/img42.gif">大,还要满足附加的“正规性”条件:<I>af</I>(<I>n</I>/<I>b</I>)≤<I>cf</I>(<I>n</I>)。这个附加的“正规性”条件的直观含义是<I>a</I>个子间题的再分解和再综合所需要的时间最多与原问题的分解和综合所需要的时间同阶。我们在一般情况下将碰到的以多项式为界的函数基本上都满足这个正规性条件。</P>
b
 楼主| 发表于 2004-5-29 03:30:16 | 显示全部楼层
<>还有一点很重要,即要认识到上述三类情况并没有覆盖所有可能的<I>f</I>(<I>n</I>)。在第一类情况和第二类情况之间有一个间隙:<I>f</I>(<I>n</I>)小于但不是多项式地小于<img src="http://algorithm.myrice.com/algorithm/complexity/images/img43.gif">;类似地,在第二类情况和第三类情况之间也有一个间隙:<I>f</I>(<I>n</I>)大于但不是多项式地大于<img src="http://algorithm.myrice.com/algorithm/complexity/images/img44.gif">。如果函数<I>f</I>(<I>n</I>)落在这两个间隙之一中,或者虽有<img src="http://algorithm.myrice.com/algorithm/complexity/images/img45.gif">,但正规性条件不满足,那么,本定理无能为力。</P><>下面是几个应用例子。</P><><B>例1</B> 考虑</P><P><I>T</I>(<I>n</I>)=9<I>T</I>(<I>n</I>/3)+<I>n</I><SUB>0</SUB></P><P>对照(6.17),我们有<I>a</I>=9,<I>b</I>=3,<I> f</I>(<I>n</I>)=<I>n</I>, <img src="http://algorithm.myrice.com/algorithm/complexity/images/img46.gif">,取<img src="http://algorithm.myrice.com/algorithm/complexity/images/img47.gif">,便有<img src="http://algorithm.myrice.com/algorithm/complexity/images/img48.gif">,可套用第一类情况的公式,得<I>T</I>(<I>n</I>)=<I>θ</I>(<I>n</I><SUP>2</SUP>)。</P><P><B>例2 </B>考虑</P><P>T(n)=T(2n/3)+1</P><P>对照(6.17),我们有a=1,b=3/2, f(n)=1,<img src="http://algorithm.myrice.com/algorithm/complexity/images/img49.gif">,可套用第二类情况的公式,得T(n)=θ(logn)。</P><P><B>例3</B> 考虑</P><P>T(n)=3T(n/4)+nlogn</P><P>对照(6.17),我们有a=3,b=4, f(n)=nlog n, <img src="http://algorithm.myrice.com/algorithm/complexity/images/img50.gif">,只要取<img src="http://algorithm.myrice.com/algorithm/complexity/images/img51.gif">,便有<img src="http://algorithm.myrice.com/algorithm/complexity/images/img52.gif">。进一步,检查正规性条件:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img53.gif"></P><P>只要取c=3/4,便有af(n/b)≤cf(n),即正规性条件也满足。可套用第三类情况的公式,得T(n)=θ(f(n))=θ(nlogn)。</P><P>最后举一个本方法对之无能为力的例子。</P><P>考虑</P><P><I>T</I>(<I>n</I>)=2<I>T</I>(<I>n</I>/2)+<I>n</I>log<I>n</I></P><P>对照(6.17),我们有<I>a</I>=2,<I>b</I>=2,<I> f</I>(<I>n</I>)=<I>n</I>log<I> n</I>, <img src="http://algorithm.myrice.com/algorithm/complexity/images/img54.gif">,虽然<I>f</I>(<I>n</I>)渐近地大于<img src="http://algorithm.myrice.com/algorithm/complexity/images/img55.gif">,但<I>f</I>(<I>n</I>)并不是多项式地大于<img src="http://algorithm.myrice.com/algorithm/complexity/images/img56.gif">,因为对于任意的正常数<I>ε</I>,</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img57.gif">,</P><P>即<I>f</I>(<I>n</I>)在第二类情况与第三类情况的间隙里,本方法对它无能为力。</P><!-- #EndEditable -->
b
 楼主| 发表于 2004-5-29 03:30:39 | 显示全部楼层
<H3>递归方程组解的渐进阶的求法——差分方程法</H3><>这里只考虑形如:</P><><I>T</I>(<I>n</I>)=<I>c</I><SUB>1</SUB><I>T</I>(<I>n</I>-1)+<I>c</I><SUB>2</SUB><I>T</I>(<I>n</I>-2)+…+<I> c</I><SUB>k</SUB><I>T</I>(<I>n</I>-k)+<I>f</I>(<I>n</I>),<I>n</I>≥<I>k</I> (6.18)</P><>的递归方程。其中<I>c</I><SUB>i </SUB>(i=l,2,…,<I>k</I>)为实常数,且<I>c</I><SUB>k</SUB>≠0。它可改写为一个线性常系数<I>k</I>阶非齐次的差分方程:</P><P><I>T</I>(<I>n</I>)-<I>c</I><SUB>1</SUB><I>T</I>(<I>n</I>-1)-<I> c</I><SUB>2</SUB><I>T</I>(<I>n</I>-2)-…-<I>c</I><SUB>k</SUB><I>T</I>(<I>n</I>-k)=<I>f</I>(<I>n</I>),<I>n</I>≥<I>k</I> (6.19)</P><P>(6.19)与线性常系数<I>k</I>阶非齐次常微分方程的结构十分相似,因而解法类同。限于篇幅,这里直接给出(6.19)的解法,略去其正确性的证明。</P><P><B>第一步</B>,求(6.19)所对应的齐次方程:</P><P><I>T</I>(<I>n</I>)-<I>c</I><SUB>1</SUB><I>T</I>(<I>n</I>-1)-<I> c</I><SUB>2</SUB><I>T</I>(<I>n</I>-2)-…-<I>c</I><SUB>k</SUB><I>T</I>(<I>n</I>-k)=0 (6.20)</P><P>的基本解系:写出(6.20)的特征方程:</P><P><I>C</I>(<I>t</I>)=<I>t</I><SUP>k</SUP>-<I>c</I><SUB>1</SUB><I>t</I><SUP>k-1</SUP>-<I>c</I><SUB>2</SUB><I>t</I><SUP>k-2</SUP> -…-<I>c</I><SUB>k</SUB>=0 (6.21)</P><P>若<I>t</I>=<I>r</I>是(6.21)的m重实根,则得(6.20)的m个基础解<I>r</I><SUP>n</SUP>,<I>nr</I><SUP>n</SUP>,<I>n</I><SUP>2</SUP><I>r</I><SUP>n</SUP>,…,<I>n</I><SUP>m-1</SUP><I>r</I><SUP>n</SUP>;若<I>ρe</I><SUP>iθ</SUP>和<I>ρe<SUP>-</SUP></I><SUP>iθ</SUP>是(6.21)的一对<I>l</I>重的共扼复根,则得(6.20)的2<I>l</I>个基础解<I>ρ</I><SUP>n</SUP>cos<I>nθ</I>,<I>ρ</I><SUP>n</SUP>sin<I>nθ</I>,<I>nρ</I><SUP>n</SUP>cos<I>nθ</I>,<I>nρ</I><SUP>n</SUP>sin<I>nθ</I>,…,<I>n<SUP>l</SUP></I><SUP>-1</SUP><I>ρ</I><SUP>n</SUP>cos<I>nθ</I>,<I>n<SUP>l</SUP></I><SUP>-1</SUP><I>ρ</I><SUP>n</SUP>cos<I>nθ</I>。如此,求出(6.21)的所有的根,就可以得到(6.20)的<I>k</I>个的基础解。而且,这<I>k</I>个基础解构成了(6.20)的基础解系。即(6.20)的任意一个解都可以表示成这<I>k</I>个基础解的线性组合。</P><P><B>第二步</B>,求(6.19)的一个特解。理论上,(6.19)的特解可以用Lagrange常数变易法得到。但其中要用到(6.20)的通解的显式表达,即(6.20)的基础解系的线性组合,十分麻烦。因此在实际中,常常采用试探法,也就是根据<I>f</I>(<I>n</I>)的特点推测特解的形式,留下若干可调的常数,将推测解代人(6.19)后确定。由于(6.19)的特殊性,可以利用迭加原理,将<I>f</I>(<I>n</I>)线性分解为若干个单项之和并求出各单项相应的特解,然后迭加便得到<I>f</I>(<I>n</I>)相应的特解。这使得试探法更为有效。为了方便,这里对三种特殊形式的<I>f</I>(<I>n</I>),给出(6.19)的相应特解并列在表6-1中,可供直接套用。其中<I>p</I><SUB>i</SUB>,i=1,2,…,s是待定常数。</P>
b
 楼主| 发表于 2004-5-29 03:30:55 | 显示全部楼层
< align=center>表6-1 方程(6.19)的常用特解形式</P><TABLE borderColor=#ffffff cellSpacing=0 cellPadding=5 width="95%" align=center bgColor=#e0e0e0 border=1><TR><TH width=79><B><I>f</I>(<I>n</I>)的形式</B> </TH><TH width=156><B>条    件</B> </TH><TH width=333><B>方程(6.19)的特解的形式</B> </TH></TR><TR><TD align=middle width=79 rowSpan=2><I>a</I><SUP>n</SUP> </TD><TD width=156><I>C</I>(<I>a</I>)≠0 </TD><TD width=333><img src="http://algorithm.myrice.com/algorithm/complexity/images/img58.gif"> </TD></TR><TR><TD width=156><I>a</I>是<I>C</I>(<I>t</I>)的<I>m</I>重根 </TD><TD width=333><img src="http://algorithm.myrice.com/algorithm/complexity/images/img59.gif"> </TD></TR><TR><TD align=middle width=79 rowSpan=2><I>n</I><SUP>s</SUP> </TD><TD width=156><I>C</I>(1)≠0 </TD><TD width=333><img src="http://algorithm.myrice.com/algorithm/complexity/images/img60.gif"> </TD></TR><TR><TD width=156>1是<I>C</I>(<I>t</I>)的<I>m</I>重根 </TD><TD width=333><img src="http://algorithm.myrice.com/algorithm/complexity/images/img61.gif"> </TD></TR><TR><TD align=middle width=79 rowSpan=2><I>n</I><SUP>s</SUP><I>a</I><SUP>n</SUP> </TD><TD width=156><I>C</I>(<I>a</I>)≠0 </TD><TD width=333><img src="http://algorithm.myrice.com/algorithm/complexity/images/img62.gif"> </TD></TR><TR><TD width=156><I>a</I>是<I>C</I>(<I>t</I>)的<I>m</I>重根 </TD><TD width=333><img src="http://algorithm.myrice.com/algorithm/complexity/images/img63.gif"></TD></TR></TABLE>
b
 楼主| 发表于 2004-5-29 03:31:12 | 显示全部楼层
<><B>第三步</B>,写出(6.19)即(6.18)的通解</P><><img src="http://algorithm.myrice.com/algorithm/complexity/images/img64.gif"> (6.22)</P><>其中{<I>T</I><SUB>i</SUB>(<I>n</I>),i=0,1,2,…,<I>n</I>}是(6.20)的基础解系,<I>g</I>(<I>n</I>)是(6.19)的一个特解。然后由(6.18)的初始条件</P><P><I>T</I>(<I>i</I>)=<I>T</I><SUB>i</SUB> ,i=1,2,…,<I>k</I>-1</P><P>来确定(6.22)中的待定的组合常数{<I>a</I><SUB>i</SUB>},即依靠线性方程组</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img65.gif"></P><P>或</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img66.gif"></P><P>解出{<I>a</I><SUB>i</SUB>},并代回(6.22)。其中<I>β</I><SUB>j</SUB>=<I>T</I><SUB>j</SUB>-<I>g</I>(<I>j</I>),<I>j</I>=0,1,2,…,<I>k</I>-1。</P><P><B>第四步</B>,估计(6.22)的渐近阶,即为所要求。</P><P>下面用两个例子加以说明。</P><P><B>例l</B> 考虑递归方程</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img67.gif"></P><P>它的相应特征方程为:</P><P><I>C</I>(<I>t</I>)=<I>t</I><SUP>2</SUP>-<I>t</I>-1=0</P><P>解之得两个单根<img src="http://algorithm.myrice.com/algorithm/complexity/images/img68.gif">和<img src="http://algorithm.myrice.com/algorithm/complexity/images/img69.gif">。相应的(6.20)的基础解系为{<I>r</I><SUB>0</SUB><SUP>n</SUP>,<I>r</I><SUB>1</SUB><SUP>n</SUP>}。相应的(6.19)的一个特解为<I>F</I>*(<I>n</I>)=-8,因而相应的(6.19)的通解为:</P><P><I>F</I>(<I>n</I>)=<I>a</I><SUB>0</SUB><I>r</I><SUB>0</SUB><SUP>n </SUP>+<I>a</I><SUB>1</SUB><I>r</I><SUB>1</SUB><SUP>n</SUP>- 8</P><P>令其满足初始条件,得二阶线性方程组:</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img70.gif"></P><P>或</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img71.gif"></P><P>或</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img72.gif"></P><P>解之得<img src="http://algorithm.myrice.com/algorithm/complexity/images/img73.gif">,<img src="http://algorithm.myrice.com/algorithm/complexity/images/img74.gif">,从而</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img82.gif"></P><P>于是</P><P><img src="http://algorithm.myrice.com/algorithm/complexity/images/img84.gif">。</P><P><B>例2</B> 考虑递归方程 </P><P><I>T</I>(<I>n</I>)=4<I>T</I>(<I>n</I>-1)-4<I>T</I>(<I>n</I>-2)+2<SUP>n</SUP><I>n</I> (6.23)</P><P>和初始条件<I>T</I>(0)=0,<I>T</I>(1)=4/3。</P><P>它对应的特征方程(6.21)为</P><P><I>C</I>(<I>t</I>)=<I>t</I><SUP>2</SUP>-4<I>t</I>+4=0</P><P>有一个两重根<I>r</I> =2。故相应的(6.20)的基础解系为{2<SUP>n</SUP>,2<SUP>n</SUP>n}。由于<I>f</I>(<I>n</I>)=2<SUP>n</SUP>n,利用表6-1,相应的(6.19)的一个特解为</P><P><I>T</I>*(<I>n</I>)=<I>n</I><SUP>2</SUP>(<I>p</I><SUB>0</SUB>+<I>p</I><SUB>1</SUB><I>n</I>)2<SUP>n</SUP>,</P><P>代人(6.23),定出<I>p</I><SUB>0</SUB>=1/2,<I>p</I><SUB>1</SUB>=1/6。因此相应的(6.19)的通解为:</P><P><I>T</I>(<I>n</I>)=<I>a</I><SUB>0</SUB>2<SUP>n</SUP>+<I>a</I><SUB>1</SUB><I>n</I>2<SUP>n</SUP>+<I>n</I><SUP>2</SUP>(1/2+<I>n</I>/6)2<SUP>n</SUP>,</P><P>令其满足初始条件得<I>a</I><SUB>0</SUB>=<I>a</I><SUB>1</SUB>=0,从而</P><P><I>T</I>(<I>n</I>)=<I>n</I><SUP>2</SUP>(1/2+<I>n</I>/6)2<SUP>n</SUP></P><P>于是<I>T</I>(<I>n</I>)=<I>θ</I>(<I>n</I><SUP>3</SUP>2<SUP>n</SUP>)。</P><!-- #EndEditable -->
  1. &lt;SCRIPT src="../../lib/footer.js"&gt;

  2. &lt;script&gt;
复制代码
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-30 19:33 , Processed in 0.055494 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表