做酒水网站陕西有哪些/广州seo优化费用
master method(主定理)
假设有递推关系式 T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f(n)T(n)=aT(bn)+f(n) ,其中 nnn 为问题的规模,aaa 为递推的子问题数量,nb\frac{n}{b}bn 为每个子问题的规模(假设每个子问题的基本规模基本一样),f(n)f(n)f(n) 为递推以外进行的计算工作。
a≥1,b>1a \geq 1, b > 1a≥1,b>1 为常数,f(n)f(n)f(n) 为函数,T(n)T(n)T(n) 为非负整数。则有以下结果(分类讨论):
(1)若 f(n)=O(nlogba−ε)f(n) = O(n^{log_ba - \varepsilon})f(n)=O(nlogba−ε) ,ε>0\varepsilon > 0ε>0 ,那么 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogba)
(2)若 f(n)=Θ(nlogba)f(n) = \Theta(n^{log_ba})f(n)=Θ(nlogba) ,那么 T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{log_ba}logn)T(n)=Θ(nlogbalogn)
(3)若 f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{log_ba + \varepsilon})f(n)=Ω(nlogba+ε) ,ε>0\varepsilon > 0ε>0 ,且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n) ,那么 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n))
注:摘自百度百科,主定理。
主定理翻译
简单翻译下:
对于递推关系式 T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f(n)T(n)=aT(bn)+f(n) 可以分为三种情况讨论 T(n)T(n)T(n) 等于多少。
第一种情况
如果 f(n)=O(nlogba−ε)f(n) = O(n^{log_ba - \varepsilon})f(n)=O(nlogba−ε) ,ε>0\varepsilon > 0ε>0 ,那么时间复杂度就是 T(n)=O(nlogba)T(n) = O(n^{log_ba})T(n)=O(nlogba)
可能会觉得明明就是 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogba) ,怎么变成 T(n)=O(nlogba)T(n) = O(n^{log_ba})T(n)=O(nlogba)
这个应该是个数学问题,可以简单理解成一切 Θ(f(n))\Theta(f(n))Θ(f(n)) 都是 O(f(n))O(f(n))O(f(n)) ,但是不可以反过来。
这个暂时没想到现成的代码例子(想到了就补上)。就举个抽象的例子吧。
比如 T(n)=4×T(n2)+nT(n) = 4 \times T(\frac{n}{2}) + nT(n)=4×T(2n)+n
我们通过递推式可以得到 a=4,b=2,f(n)=na = 4, b = 2, f(n) = na=4,b=2,f(n)=n
我们先计算下 nlogban^{log_ba}nlogba 显然 nlogba=n2n^{log_ba} = n^2nlogba=n2
f(n)=n=O(n2−1)f(n) = n = O(n^{2 - 1})f(n)=n=O(n2−1) 因此我们得到 ε=1>0\varepsilon = 1 > 0ε=1>0 符合第一种情况。
故 T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2) 即时间复杂度式 O(n2)O(n^2)O(n2)
注意:这里的 T(n)T(n)T(n) 是递归函数的执行时间。
第二种情况
如果 f(n)=Θ(nlogba)f(n) = \Theta(n^{log_ba})f(n)=Θ(nlogba) ,那么 T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{log_ba}logn)T(n)=Θ(nlogbalogn)
第一种情况已经讲的很详细了,现在直接举具体的例子-我们熟知的快速排序
主要代码部分:
void quick_sort(int arr[], int low, int high) {if (low >= high) {return;}int mid = split(arr, low, high);quick_sort(arr, low, mid - 1);quick_sort(arr, mid + 1, high);
}
我们设 T(n)T(n)T(n) 为 quick_sort 的执行时间。
则 T(n)=n+T(n2)+T(n2)=2T(n2)+nT(n) = n + T(\frac{n}{2}) + T(\frac{n}{2}) = 2T(\frac{n}{2}) + nT(n)=n+T(2n)+T(2n)=2T(2n)+n
我们先计算下 nlogban^{log_ba}nlogba 显然 nlogba=n=f(n)n^{log_ba} = n = f(n)nlogba=n=f(n) 满足第二种情况。
那么 T(n)=(nlogn)T(n) = (nlogn)T(n)=(nlogn) 即时间复杂度 O(nlogn)O(nlogn)O(nlogn)
第三种情况
如果 f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{log_ba + \varepsilon})f(n)=Ω(nlogba+ε) ,ε>0\varepsilon > 0ε>0 ,且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n) ,那么 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n))
举个抽象例子吧 T(n)=2T(n2)+n2T(n) = 2T(\frac{n}{2}) + n^2T(n)=2T(2n)+n2
我们先计算下 nlogban^{log_ba}nlogba 显然 nlogba=nn^{log_ba} = nnlogba=n
f(n)=n2=Ω(n1+1)f(n) = n^2 = \Omega(n^{1 + 1})f(n)=n2=Ω(n1+1) 因此我们得到 ε=1>0\varepsilon = 1 > 0ε=1>0 且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n)
对于后面这个 且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n) 只要我们的 c∈(12,1)c \in (\frac{1}{2}, 1)c∈(21,1) 就可以满足 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n)
所以 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n)) 即是时间复杂度为 O(n2)O(n^2)O(n2)
总结
主定理被描述为解决这种递推的“天下无敌法”(master method),对于我们分析递归的时间复杂度是超级有帮助的。
也并不是所有的递归都可以用主题定理推出来。(比如说汉诺塔问题,斐波那契数列等,他们的递推式显然并不满足主定理的递推式,根据严蔚民版的数据结构上的方法,我们直接暴力递推就好了)
此外,还有一种分析递归时间复杂度的方法叫做 recusion tree 递归树分析法,以后有时间再介绍吧。