Algorithms | L - 3 | Time Analysis of Recursive Program【递归算法时间复杂度计算】

目录

方法一:Back Substitution 回代法

方法二:Recursive tree method  递归树法


方法一:Back Substitution 回代法

例题一:

A (n) {
    if (n > 1) {         //if 语句执行时间为 1
        return A(n-1);
    }
}

1、假设该程序执行时间符合  T(n)  这样一个函数;

2、由代码可知执行时间为:T(n)    = 1 + T(n-1)······式子1

3、由上面式子可以知道       T(n-1) = 1 + T(n-2)······式子2

                               同理       T(n-2) = 1 + T(n-3)······式子3

4、利用回代法可得:T(n) = 1 + T(n-1)

                                          = 2 + T(n-2)

                                          = 3 + T(n-3) 

                                          = k + T(n-k)

5、由if(n > 1)可知,当 n - k = 1,即 k = n - 1 时程序只执行if语句,然后停止。

将 k 用 n 替换得到:T(n) = n-1 + T(1) = n - 2

6、得到该递归算法时间复杂度为 O(n) 

例题二:这个例题没有代码,仅列出程序耗费的时间表达式

条件:输入为n时,程序执行时间满足函数T(n)

T(n) = n + T(n-1)    ……  n > 1

T(n) = 1                   ……  n = 1

对于上面式子的时间复杂的计算与例题一类似

1、T(n)    = n + T(n-1)······式子1

      T(n-1) = n-1 + T(n-2)······式子2

      T(n-2) = n-2 + T(n-3)······式子3

      T(n-3) = n-3 + T(n-4)······式子3

2、利用回代法可得:T(n) = n + T(n-1)

                                          = n + (n-1) + T(n-2)

                                          = n + (n-1) + (n-2) + T(n-3) 

                                          = n + (n-1) + (n-2) + ······ +(n-k) + T(n-(k+1))

3、n - (k+1) = 1 => k = n-2;将代入得:

     T(n) = n + (n-1) + (n-2) + ··· + 2 + T(1)

             = n(n+1)/2 - 1 + 1

4、时间复杂度为:O(n^{2})

方法二:Recursive tree method  递归树法

例题三:

这个例题没有代码,仅列出程序耗费的时间表达式

条件:输入为n时,程序执行时间满足函数T(n)

T(n) = 2T(n/2) + c   …… n > 1

T(n) = c                   ……  n = 1

解:

1、

     T(n) = c + 2T(n/2)                    T(n/2) = c + 2T(n/4)                      T(n/4) = c + 2T(n/8) 

            作图如下                                  作图如下                                        作图如下

                                   

 2、将关系带入第一个图,我们可以得到下图

       

 3、我们发现除最后一行外,每一行执行时间都满足式子:2^k*c,最后一行为T(n/2^k)形式,

       当我们将上面的图无限拓展时,最后一行每个元素就为T(n/2^k)

       我们知道,当输入为1时,执行时间为常数c,所以程序在输入为1时就不会继续递归了。

       也就是n/2^k = 1 时,函数停止。计算得 2^k = n

4、按照上图,我们将每一行执行时间相加:

T(n) = c ( 2^0 + 2^1 + 2^2 + 2^3 + ... + 2^k)      ......等比数列求和

       = c[1(1 - 2^(k+1))/(1-2)]     ......这里写 k+1  次方的原因是:总共k+1项

       = (2^(k+1) - 1) c     .......由于2^k = n

       = 2n*c - c

5、时间复杂度为:O(n)

例题三:

这个例题没有代码,仅列出程序耗费的时间表达式

条件:输入为n时,程序执行时间满足函数T(n)

T(n) = 2T(n/2) + n   …… n > 1

T(n) = 1                   ……  n = 1

解:

1、  T(n) = 2T(n/2) + n        T(n/2) = 2T(n/4) + n/2          T(n/4) = 2T(n/8) + n/4    

        根据上面三个式子画出递归树

 

2、观察发现,1)        除最后一行,每一行元素和都为n

                        2)        最后一行每个元素的参数都为n/2^k,且元素个数为2^k。

                        3)        当无限延伸后,在n/2^k = 1 (可得2^k = n, k = {log_{2}}^{n}) 处停止,T(1) = 1

                        4)        最后一行元素有2^k个,每个都为一,最后一行和为:2^k * 1 = n * 1 = n。

                        5)        每一行元素与行数(L)关系:元素 n/2^k 中的 k = L - 1 

3、将每一行时间加和:T(n) = n * L

                                              = n * (k+1)

                                              = n * ({log_{2}}^{n}+ 1)

4、时间复杂度为O(nlog_{2}^{n})

总结:在我看来,这两种方法本质是一样的,只是呈现的方法不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值