目录
方法二: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()
方法二: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 = ) 处停止,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 * (+ 1)
4、时间复杂度为O()
总结:在我看来,这两种方法本质是一样的,只是呈现的方法不同。