主方法求解递归式

主方法求解递归式

  在分析递归的算法时,主方法可以较快的计算出算法的时间复杂度
主方法可以用于满足以下形式的递归式。

T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中 a ≥ 1 和 b > 1 a\geq1和b>1 a1b>1是常数, f ( n ) f(n) f(n)是渐进函数。
  主方法描述的算法:将原本规模为 n n n的问题,分解为 a a a 个规模为 n / b n/b n/b 的子问题,其中 a , b ∈ Z + a,b\in \mathbb{Z^+} a,bZ+,函数 f ( n ) f(n) f(n) 包含了问题分解和子问题合并的代价。

下面是归并排序的递归式:
T ( n ) = { Θ ( 1 ) 若 n = 1 2 T ( n / 2 ) + Θ ( n ) 若 n > 1 T(n)= \begin{cases} \Theta(1) & 若n=1 \\ 2T(n/2)+\Theta(n) & 若n>1 \\ \end{cases} T(n)={Θ(1)2T(n/2)+Θ(n)n=1n>1

其中, a = 2 ,   b = 2 ,   f ( n ) = Θ ( n ) 。 a=2,\ b=2,\ f(n)=\Theta(n)。 a=2, b=2, f(n)=Θ(n)
  在具体处理过程中,会遇到 n / b n/b n/b 可能不是整数的情况。可以将 a a a T ( n / b ) T(n/b) T(n/b)全都替换为 T ( ⌊ n / b ⌋ ) 或 T ( ⌈ n / b ⌉ ) T(\lfloor n/b \rfloor)或T(\lceil n/b\rceil) T(n/b)T(n/b) 并不会影响递归式的渐进性质。


主定理

主定理: a ≥ 1 和 b > 1 a\geq1和b>1 a1b>1是常数, f ( n ) f(n) f(n)是一个函数, T ( n ) T(n) T(n)是定义在非负整数上的递归式:
T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中将 n / b n/b n/b 解释为 ⌊ n / b ⌋ 或 ⌈ n / b ⌉ \lfloor n/b \rfloor或\lceil n/b\rceil n/bn/b。那么 T ( n ) T(n) T(n)有如下渐近界:

  1. 若对某个常数 ϵ > 0 \epsilon >0 ϵ>0 f ( n ) = O ( n l o g b a − ϵ ) f(n)=\Omicron(n^{log_ba-\epsilon}) f(n)=O(nlogbaϵ) ,则 T ( n ) = Θ ( n l o g b a ) 。 T(n)=\Theta(n^{log_ba})。 T(n)=Θ(nlogba)
  2. f ( n ) = Θ ( n l o g b a ) f(n)=\Theta(n^{log_ba}) f(n)=Θ(nlogba),则 T ( n ) = Θ ( n l o g b a   l g n ) T(n)=\Theta(n^{log_ba}\ lgn) T(n)=Θ(nlogba lgn)
  3. 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0 f ( n ) = Ω ( n l o g b a + ϵ ) f(n)=\Omega(n^{log_ba+\epsilon}) f(n)=Ω(nlogba+ϵ),且对某个常数 c < 1 c<1 c<1 和所有足够大的 n n n a f ( n / b ) ≤ c f ( n ) af(n/b)\leq cf(n) af(n/b)cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))

  实际上就是将函数 f ( n ) f(n) f(n) 和函数 n l o g b a n^{log_ba} nlogba 进行比较。如情况1和情况3,两者的较大者决定了递归式的解。对于情况2,则再乘上一个对数因子 l g n lgn lgn ,解为 T ( n ) = Θ ( n l o a b a   l g n ) = Θ ( f ( n )   l g n ) T(n)=\Theta(n^{loa_ba} \ lgn)=\Theta(f(n)\ lgn) T(n)=Θ(nloaba lgn)=Θ(f(n) lgn)

注意: 对于第1种情况和第3种情况的 f ( n ) \mathbf{f(n)} f(n) 渐进小于和渐进大于 n l o g b a \mathbf{n^{log_ba}} nlogba,其中相差一个因子 n ϵ n^\epsilon nϵ,其中 ϵ \epsilon ϵ为大于0的常数,即要满足 多项式的差距。同时第三种情况还要满足 "正则"条件 a f ( n / b ) ≤ c f ( n ) af(n/b)\leq cf(n) af(n/b)cf(n)
这三种情况未覆盖 f ( n ) f(n) f(n) 的所有可能性。 f ( n ) f(n) f(n) 不满足多项式级别的渐进小于 n l o g b a n^{log_ba} nlogba而处于情况1和情况2之间。同理,不满足 f ( n ) f(n) f(n) 渐进大于而处于 n l o g b a n^{log_ba} nlogba 而处于情况2和情况3之间,或则情况3而不满足正则条件,均不能使用主方法求解递归式。


主方法使用例子

1、 T ( n ) = 9 T ( n / 3 ) + n T(n)=9T(n/3)+ n T(n)=9T(n/3)+n
其中 a = 9 , b = 3 , f ( n ) = n a=9,b=3,f(n)=n a=9,b=3,f(n)=n。很容易求解 n l o g b a = n 2 = Θ ( n 2 ) n^{log_ba}=n^2=\Theta(n^2) nlogba=n2=Θ(n2)
f ( n ) = n = O ( n l o g b a − ϵ ) f(n)=n=\Omicron( n^{log_ba-\epsilon}) f(n)=n=O(nlogbaϵ),其中 ϵ = 1 \epsilon=1 ϵ=1,故满足情况1,因此得出 T ( n ) = Θ ( n 2 ) T(n)=\Theta(n^2) T(n)=Θ(n2)

2、 T ( n ) = T ( 2 n / 3 ) + 1 T(n)=T(2n/3)+1 T(n)=T(2n/3)+1
其中 a = 1 , b = 3 / 2 , f ( n ) = 1 a=1,b=3/2,f(n)=1 a=1,b=3/2,f(n)=1 n l o g b a = n l o g 3 / 2 1 = Θ ( 1 ) n^{log_ba}=n^{log_{3/2}1}=\Theta(1) nlogba=nlog3/21=Θ(1)
f ( n ) = Θ ( n l o g b a ) = Θ ( 1 ) f(n)=\Theta(n^{log_ba})=\Theta(1) f(n)=Θ(nlogba)=Θ(1)。因此满足情况2,则 T ( n ) = Θ ( n l o g b a l g n ) = Θ ( l g n ) T(n)=\Theta(n^{log_ba} lgn)=\Theta(lgn) T(n)=Θ(nlogbalgn)=Θ(lgn)

3、 T ( n ) = 3 T ( n / 4 ) + n l g n T(n)=3T(n/4)+nlgn T(n)=3T(n/4)+nlgn
其中 a = 3 , b = 4 , f ( n ) = n l g n a=3,b=4,f(n)=nlgn a=3,b=4,f(n)=nlgn n l o g b a = n l o g 4 3 = O ( n 0.793 ) n^{log_ba}=n^{log_43}=\Omicron(n^{0.793}) nlogba=nlog43=O(n0.793)。由于 f ( n ) = Ω ( n l o g 4 3 + ϵ ) f(n)=\Omega(n^{log_43+\epsilon}) f(n)=Ω(nlog43+ϵ),其中 ϵ ≈ 0.2 \epsilon\approx0.2 ϵ0.2
接下来证明正则条件,即
a f ( n / b ) ≤ c f ( n ) 3 ( n / 4 ) l g ( n / 4 ) ≤ c n l g n \begin{aligned} af(n/b) & \leq cf(n) \\ 3(n/4)lg(n/4) & \leq cnlgn\\ \end{aligned} af(n/b)3(n/4)lg(n/4)cf(n)cnlgn
显然,当 c = 3 / 4 c=3/4 c=3/4时,不等式成立。
T ( n ) = Θ ( f ( n ) ) = Θ ( n l g n ) T(n)=\Theta(f(n))=\Theta(nlgn) T(n)=Θ(f(n))=Θ(nlgn)

下面这个递归式不能运用主方法
4、 T ( n ) = 2 T ( n / 2 ) + n l g n T(n)=2T(n/2)+nlgn T(n)=2T(n/2)+nlgn
其中 a = 2 , b = 2 , f ( n ) = n l g n a=2,b=2,f(n)=nlgn a=2,b=2,f(n)=nlgn n l o g b a = Θ ( n ) n^{log_ba}=\Theta(n) nlogba=Θ(n)
可能会得到错误的结论有: f ( n ) = Ω ( n l o g 2 2 + ϵ ) f(n)=\Omega(n^{log_22+\epsilon}) f(n)=Ω(nlog22+ϵ)。然后继续求解下去。
实际上,不满足之前提到的情况1和情况3的渐进差距需要时多项式级别的。
即:
n l g n n l o g 2 2 = n l g n n = l g n = ο ( n ϵ ) \frac{nlgn} {n^{log_22}}=\frac {nlgn} {n} = lgn = \omicron(n^\epsilon) nlog22nlgn=nnlgn=lgn=ο(nϵ)

这里的 ο \mathbf\omicron ο 符号代表非渐进紧确的上界,
如: f ( n ) = ο ( g ( n ) ) f(n)=\omicron(g(n)) f(n)=ο(g(n)): ∀ c > 0 \forall c>0 c>0 ∃ \exists 常量 n 0 > 0 n_0>0 n0>0,使得 ∀ n ≥ n 0 \forall n\geq n_0 nn0,有 0 ≤ f ( n ) < c g ( n ) 0 \leq f(n) < cg(n) 0f(n)<cg(n)。简单理解小于但不等于。

即不满足多项式级别的大于。故处于情况2和情况3之间。不可以采用主方法求解。

练习题4.5-1: 建议自己动手做完后对照。

a. T ( n ) = 2 T ( n / 4 ) + 1 T(n)=2T(n/4)+1 T(n)=2T(n/4)+1
其中 a = 2 , b = 4 , f ( n ) = 1 a=2,b=4,f(n)=1 a=2,b=4,f(n)=1, n l o g b a = n n^{log_ba}= \sqrt n nlogba=n
f ( n ) = O ( n l o g b a − ϵ ) = O ( n 0.5 − ϵ ) f(n) = \Omicron(n^{log_ba-\epsilon}) = \Omicron(n^{0.5-\epsilon}) f(n)=O(nlogbaϵ)=O(n0.5ϵ),其中 ϵ = 0.5 \epsilon = 0.5 ϵ=0.5
T ( n ) = Θ ( n l o g 4 2 ) = Θ ( n ) T(n) = \Theta(n^{log_42}) = \Theta(\sqrt n) T(n)=Θ(nlog42)=Θ(n )


b. T ( n ) = 2 T ( n / 4 ) + n T(n)=2T(n/4)+\sqrt{n} T(n)=2T(n/4)+n
同上,可以求出 n l o g b a n^{log_ba} nlogba,由于 f ( n ) = n = Θ ( n ) = Θ ( n l o g 4 2 ) f(n) = \sqrt n =\Theta(\sqrt n) = \Theta(n^{log_42}) f(n)=n =Θ(n )=Θ(nlog42)
T ( n ) = Θ ( f ( n ) l g n ) = Θ ( n   l g n ) T(n) = \Theta( f(n)lgn) = \Theta(\sqrt n \ lgn) T(n)=Θ(f(n)lgn)=Θ(n  lgn)


c. T ( n ) = 2 T ( n / 4 ) + n T(n)=2T(n/4)+n T(n)=2T(n/4)+n
同上,求出 n l o g b a n^{log_ba} nlogba,由于 f ( n ) = Ω ( n 0.5 + ϵ ) f(n) = \Omega(n^{0.5 + \epsilon}) f(n)=Ω(n0.5+ϵ), 其中 ϵ = 0.5 \epsilon =0.5 ϵ=0.5。接下来证明正则条件:

a f ( n / b ) ≤ c f ( n ) 2 ∗ ( n / 4 ) ≤ c   n 1 2 ≤ c \begin{aligned} a f(n /b) & \leq c f(n) \\ 2*(n/4) & \leq c \ n \\ \frac 1 2 & \leq c \end{aligned} af(n/b)2(n/4)21cf(n)c nc
显然,取 c = 1 2 c = \frac 1 2 c=21时,满足条件。故 T ( n ) = Θ ( f ( n ) ) = Θ ( n ) T(n) = \Theta(f(n)) = \Theta(n) T(n)=Θ(f(n))=Θ(n)


d. T ( n ) = 2 T ( n / 4 ) + n 2 T(n)=2T(n/4)+n^2 T(n)=2T(n/4)+n2
同上,求出 n l o g b a n^{log_ba} nlogba,由于 f ( n ) = n 2 = Ω ( n l o g b a + ϵ ) f(n) = n^2 = \Omega(n^{logb_a+\epsilon}) f(n)=n2=Ω(nlogba+ϵ),其中 ϵ = 1.5 \epsilon = 1.5 ϵ=1.5。下面证明正则条件:

a f ( n / b ) ≤ c f ( n ) 2 ( n / 4 ) 2 ≤ c   n 2 n 2 / 8 ≤ c   n 2 \begin{aligned} a f(n/b) & \leq c f(n) \\ 2 (n/4)^2 & \leq c \ n^2 \\ n^2/8 & \leq c \ n^2 \end{aligned} af(n/b)2(n/4)2n2/8cf(n)c n2c n2
显然,取 c = 1 / 8 c = 1/8 c=1/8 时,满足条件。故 T ( n ) = Θ ( f ( n ) ) = Θ ( n 2 ) T(n) = \Theta( f(n) ) = \Theta(n^2) T(n)=Θ(f(n))=Θ(n2)

参看文献:算法导论

### 回答1: 时间复杂度求解取决于实际的算法,一般可以分析算法的执行步骤,统计每个步骤所用的时间,从而求得时间复杂度。对于递归算法,可以通过分析递归函数的执行次数,以及每次调用递归函数所消耗的时间,来求解时间复杂度。 ### 回答2: 要求解递归时间复杂度,我们可以按照以下步骤进行: 1. 首先,确定递归的形。递推通常具有递归的特点,即问题的规模需要通过不断缩小来递归求解。例如,递归可能包含递归调用,或者具有递归的结构。 2. 其次,推导递归递归深度。递归时间复杂度通常与递归的深度相关,即需要确定递归递归深度。 3. 然后,分析递归函数的时间代价。将递归的执行过程分解为不同的子问题,确定每个子问题的时间代价。这可能涉及到递归子问题的规模和计算时间。 4. 最后,通过递归的时间代价和递归递归深度来确定递归时间复杂度。 需要注意的是,递归时间复杂度可能与递归的规模有关,也可能与递归的深度有关,具体取决于具体的情况和问题的性质。同时,递归时间复杂度也可能需要通过数学推导或递归树等方法进行求解。 总的来说,求解递归时间复杂度需要通过对递归分析递归深度的确定以及递归函数的时间代价的分析来进行。 ### 回答3: 求解递归时间复杂度需要以下步骤: 1. 确定递归的形:首先,我们需要确定递归的形递归方程,即描述递归的基本操作和递归关系的数学等。这通常需要根据问题的特点和递归的实现进行分析。 2. 求解递归方程:接下来,我们需要求解递归方程,即找到递归的解析解。这可以通过代入法、特征根法或母函数法等数学方法来实现。在这一步骤中,我们可以得到递归的通项公,并进一步进行化简。 3. 分析递归时间复杂度:一旦我们得到递归的通项公,我们可以通过分析的增长率来确定递归时间复杂度。具体来说,我们可以评估递归中的递归调用次数和每次递归操作的时间复杂度,然后将它们相乘得到最终的时间复杂度。 4. 解决递归的边界条件:最后,我们需要解决递归的边界条件,即递归的终止条件。这是因为递归只有在满足终止条件时才能收敛,否则递归会无限进行下去。在分析时间复杂度时,我们需要考虑递归的基本操作在边界条件下的执行次数和时间复杂度。 需要注意的是,求解递归时间复杂度可能涉及到数学推理和推导,需要运用到数学分析方法。具体的求解过程会根据不同的递归和问题而有所不同。同时,我们也可以借助工具和数值计算对递归进行近似求解,以便更好地估计时间复杂度的上界和下界。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值