📜  算法分析|第4组(解决重复发生)

📅  最后修改于: 2021-05-08 18:23:43             🧑  作者: Mango

在上一篇文章中,我们讨论了循环分析。许多算法本质上都是递归的。当我们分析它们时,我们得到了时间复杂度的递归关系。我们得到大小为n的输入的运行时间作为n的函数,而得出的是较小大小的输入的运行时间。例如,在“合并排序”中,为了对给定的数组进行排序,我们将其分为两半,然后递归地对两半重复该过程。最后,我们合并结果。合并排序的时间复杂度可以写成T(n)= 2T(n / 2)+ cn。还有许多其他算法,例如二进制搜索,河内塔等。

解决重复的方法主要有三种。

1)替代方法:我们先对解决方案进行猜测,然后使用数学归纳法证明该猜测正确或不正确。

For example consider the recurrence T(n) = 2T(n/2) + n

We guess the solution as T(n) = O(nLogn). Now we use induction
to prove our guess.

We need to prove that T(n) <= cnLogn. We can assume that it is true
for values smaller than n.

T(n) = 2T(n/2) + n
    <= 2cn/2Log(n/2) + n
    =  cnLogn - cnLog2 + n
    =  cnLogn - cn + n
    <= cnLogn

2)递归树方法:在此方法中,我们绘制了一个递归树,并计算了每个级别的树所花费的时间。最后,我们总结了在各个级别完成的工作。要绘制递归树,我们从给定的递归开始,并继续绘制,直到在关卡之间找到一个模式。图案通常是算术或几何级数。

For example consider the recurrence relation 
T(n) = T(n/4) + T(n/2) + cn2

           cn2
         /      \
     T(n/4)     T(n/2)

If we further break down the expression T(n/4) and T(n/2), 
we get following recursion tree.

                cn2
           /           \      
       c(n2)/16      c(n2)/4
      /      \          /     \
  T(n/16)     T(n/8)  T(n/8)    T(n/4) 
Breaking down further gives us following
                 cn2
            /            \      
       c(n2)/16          c(n2)/4
       /      \            /      \
c(n2)/256   c(n2)/64  c(n2)/64    c(n2)/16
 /    \      /    \    /    \       /    \  

To know the value of T(n), we need to calculate sum of tree 
nodes level by level. If we sum the above tree level by level, 
we get the following series
T(n)  = c(n^2 + 5(n^2)/16 + 25(n^2)/256) + ....
The above series is geometrical progression with ratio 5/16.

To get an upper bound, we can sum the infinite series. 
We get the sum as (n2)/(1 - 5/16) which is O(n2)

3)主法:
主方法是获得解决方案的直接方法。 master方法仅适用于以下重复类型或可转换为以下类型的重复。

T(n) = aT(n/b) + f(n) where a >= 1 and b > 1

有以下三种情况:
1.如果f(n)=Θ(n c ),其中c b a,则T(n)=Θ(n Log b a )

2.如果f(n)=Θ(n c ),其中c = Log b a,则T(n)=Θ(n c Log n)

3.如果f(n)=Θ(n c ),其中c> Log b a,则T(n)=Θ(f(n))

这是如何运作的?
主方法主要来自递归树方法。如果我们画出递归树T(n)= aT(n / b)+ f(n),我们可以看到在根处完成的功为f(n),在所有叶子处完成的功为Θ(n c ),其中c是Log b a。递归树的高度为Log b n
大师定理
在递归树方法中,我们计算完成的总工作量。如果在叶子上完成的工作更多,那么叶子是主要部分,那么我们的结果就变成了在叶子上完成的工作(案例1)。如果在叶和根上完成的工作渐近相同,那么我们的结果将变为高度乘以在任何水平上完成的工作(案例2)。如果从根本上完成的工作更多,那么我们的结果就变成了从根本上完成的工作(案例3)。

可以使用主方法评估其时间复杂度的一些标准算法的示例
合并排序:T(n)= 2T(n / 2)+Θ(n)。它落在情况2中,因为c为1,Log b a]也为1。因此解为Θ(n Logn)

二进制搜索:T(n)= T(n / 2)+Θ(1)。当c为0且Log b a也为0时,它也落在情况2中。因此解为Θ(Logn)

笔记:
1)不必使用主定理来求解形式为T(n)= aT(n / b)+ f(n)的重复项。给定的三种情况之间存在一些差距。例如,递归T(n)= 2T(n / 2)+ n / Logn无法使用主方法解决。

2)情况2可以扩展为f(n)=Θ(n c Log k n)
如果对于某个常数k> = 0且f = n = Log b a,f(n)=Θ(n c Log k n),则T(n)=Θ(n c Log k + 1 n)

掌握定理的实践问题和解决方案。

下一步–算法分析|第5组(摊销分析简介)

参考:
http://en.wikipedia.org/wiki/Master_theorem
麻省理工学院关于渐近符号的视频讲座复发|替代,主方法
算法入门第三版,作者:Clifford Stein,Thomas H. Cormen,Charles E. Leiserson,Ronald L. Rivest