分析算法时间复杂度--主项定理
2016-12-29 17:22
246 查看
在分析根据递归方程分析算法的时间复杂度时,常见到如下形式的方程,
T(n) = a * T(n/b) + f(n)
a ³ 1,b > 1,f(n)一般是个简单函数
这时可以有2种方法,来计算时间复杂度。一是用递归树,逐层代入原式,最终形成一个级数,
然后用一个函数来表达,得到T(n)。
二是应用主项定理Master Method 。其实,主项定理也就是对递归树方法的一种归纳,形成了
固定的计算方式,并分三种情形来计算。
这三种情形主要是比较 nlogba 与 f(n),为什么要比较这两个函数呢?
观察原式,可以看出,nlogba其实相当于用递归树方法解出的递归方程的右侧的第一项,
而f(n)则是递归方程的右侧的第二项,这样,主项定理实际上是在比较组成结果的两个函数项,
而且这种比较是按照数量级(或者说是变化幅度)来比较的,也就是说,如2n 与 28n是
数量级(变化幅度)相当的。
这样就有了三种不同的情形:
f(n) < nlogba
也就是 f(n) = O(nlogba - e ) ,e > 0为任意小的常数
或者说,f(n) 比 nlogba变化的慢,慢ne
那么,T(n) Î Q (nlogba)
f(n) > nlogba
也就是 f(n) = W(nlogba +e ) ,e > 0为任意小的常数
或者说,f(n) 比 nlogba变化的快,快ne
那么, T(n) Î Q(f(n))
可以简单地说,递归方程的右侧的两项,哪项变化的块,T(n)就属于哪项的数量级
f(n) = nlogba
也就是两项的数量级相当,就给这个数量级乘上一个lg n
T(n) Î Q(nlogba * lg n)
Examples(以下示例来源于网络):
T(n) = 5T(n/2) + Q(n2)
Case 1: If f(n) = O(nlogba - e ) for some constant e > 0 then T(n) Î Q(nlogba)
Determine: a, b, f(n) and logba
a = 5
b = 2
f(n) = Q(n2)
logb a = log2 5 ≈ 2.32
Is f(n) Î O(nlg 5 - e) for e > 0 ?
Yes. f(n) = Q(n2) Î O(nlg 5 - e) = O(n2.32 - e)
for e ≈ 0.32
T(n) Î Q(nlog25)
2. T(n) = 2T(n/2) + n
Determine: a, b, f(n) and logb(a)
a = 2
b = 2
f(n) = n
logb a = log2 2 = lg 2 = 1
Case 3: If f(n) = Q(nlogba ) then T(n) Î Q(nlogba lg
n)
f(n) = n Î Q(nlog22) = Q(n1)
T(n) Î Q(nlog22 lg n) = Q(n lg n)
3. T(n) = 5T(n/2) + Q(n3)
Determine: a, b, f(n) and logb(a)
a = 5
b = 2
f(n) = Q(n3)
logb a = log2 5 ≈ 2.32
Case 2: If f(n) = W(nlogba+e ) for some constant e >
0
f(n) = Q(n3) Î W(nlog25+e ) = W(n2.32+e )
for e ≈0.68
and af(n/b) ≤ cf(n) for some constant c < 1 and all sufficiently large n
5(n/2)3 ≤ cn3
5n3/8 ≤ cn3
c = 5/8 < 1
then T(n) Î Q(n3)
T(n) = a * T(n/b) + f(n)
a ³ 1,b > 1,f(n)一般是个简单函数
这时可以有2种方法,来计算时间复杂度。一是用递归树,逐层代入原式,最终形成一个级数,
然后用一个函数来表达,得到T(n)。
二是应用主项定理Master Method 。其实,主项定理也就是对递归树方法的一种归纳,形成了
固定的计算方式,并分三种情形来计算。
这三种情形主要是比较 nlogba 与 f(n),为什么要比较这两个函数呢?
观察原式,可以看出,nlogba其实相当于用递归树方法解出的递归方程的右侧的第一项,
而f(n)则是递归方程的右侧的第二项,这样,主项定理实际上是在比较组成结果的两个函数项,
而且这种比较是按照数量级(或者说是变化幅度)来比较的,也就是说,如2n 与 28n是
数量级(变化幅度)相当的。
这样就有了三种不同的情形:
f(n) < nlogba
也就是 f(n) = O(nlogba - e ) ,e > 0为任意小的常数
或者说,f(n) 比 nlogba变化的慢,慢ne
那么,T(n) Î Q (nlogba)
f(n) > nlogba
也就是 f(n) = W(nlogba +e ) ,e > 0为任意小的常数
或者说,f(n) 比 nlogba变化的快,快ne
那么, T(n) Î Q(f(n))
可以简单地说,递归方程的右侧的两项,哪项变化的块,T(n)就属于哪项的数量级
f(n) = nlogba
也就是两项的数量级相当,就给这个数量级乘上一个lg n
T(n) Î Q(nlogba * lg n)
Examples(以下示例来源于网络):
T(n) = 5T(n/2) + Q(n2)
Case 1: If f(n) = O(nlogba - e ) for some constant e > 0 then T(n) Î Q(nlogba)
Determine: a, b, f(n) and logba
a = 5
b = 2
f(n) = Q(n2)
logb a = log2 5 ≈ 2.32
Is f(n) Î O(nlg 5 - e) for e > 0 ?
Yes. f(n) = Q(n2) Î O(nlg 5 - e) = O(n2.32 - e)
for e ≈ 0.32
T(n) Î Q(nlog25)
2. T(n) = 2T(n/2) + n
Determine: a, b, f(n) and logb(a)
a = 2
b = 2
f(n) = n
logb a = log2 2 = lg 2 = 1
Case 3: If f(n) = Q(nlogba ) then T(n) Î Q(nlogba lg
n)
f(n) = n Î Q(nlog22) = Q(n1)
T(n) Î Q(nlog22 lg n) = Q(n lg n)
3. T(n) = 5T(n/2) + Q(n3)
Determine: a, b, f(n) and logb(a)
a = 5
b = 2
f(n) = Q(n3)
logb a = log2 5 ≈ 2.32
Case 2: If f(n) = W(nlogba+e ) for some constant e >
0
f(n) = Q(n3) Î W(nlog25+e ) = W(n2.32+e )
for e ≈0.68
and af(n/b) ≤ cf(n) for some constant c < 1 and all sufficiently large n
5(n/2)3 ≤ cn3
5n3/8 ≤ cn3
c = 5/8 < 1
then T(n) Î Q(n3)
相关文章推荐
- 高级算法 应用主项定理Master Method 求时间复杂度 判断有向图是否有环
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- MIT:算法导论——2.渐近符号、递归及解法_和连续子数组的最大和、主方法/主定理求时间复杂度
- 【01背包问题】:动态规划、回溯法和分支限界法 三种算法的对比与分析(时间复杂度方面)
- 求最大连续子列和的算法和时间复杂度的分析(包含四种不同时间复杂度的算法)
- 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 //求总共有多少总跳法,并分析算法的时间复杂度
- 算法的时间复杂度和空间复杂度分析
- 算法的时间复杂度和空间复杂度分析
- 各个算法的时间复杂度和空间复杂度分析
- 数据挖掘算法的空间复杂度与时间复杂度分析
- 算法时间复杂度与空间复杂度分析
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 算法的时间和空间复杂度的分析
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 主定理与递归树计算算法时间复杂度
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 算法分析(1)-循环的时间复杂度
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 分析算法的时间复杂度
- 重拾算法(一):算法效率分析(空间复杂度和时间复杂度)