我熟悉使用迭代解决重现:
t(1) = c1
t(2) = t(1) + c2 = c1 + c2
t(3) = t(2) + c2 = c1 + 2c2
...
t(n) = c1 + (n-1)c2 = O(n)
但是,如果我没有基本情况再次发生怎么办?我如何使用标题中提到的三种方法解决它?
t(n) = 2t(n/2) + 1
对于大师定理,我知道第一步,找到a
,b
和f(n)
:
a = 2
b = 2
f(n) = 1
但不是从这里开始的。我处于停滞状态,因为我不确定如何处理这个问题。
答案 0 :(得分:2)
我知道解决这个问题的两种方法:
(1) T(n) = 2T(n/2) + 1
(2) T(n/2) = 2T(n/4) + 1
now replace T(n/2) from (2) into (1)
T(n) = 2[2T(n/4) + 1] + 1
= 2^2T(n/4) + 2 + 1
T(n/4) = 2T(n/8) + 1
T(n) = 2^2[2T(n/8) + 1] + 2 + 1
= 2^3T(n/8) + 4 + 2 + 1
你可以继续这样做,直到你可以概括为止。最终你会发现:
T(n) = 2^kT(n/2^k) + sum(2^(k-1))
你想要T(1)所以设置n / 2 ^ k = 1并求k。当你这样做时,你会发现,k = lgn
替换lgn为k,你最终将
T(n) = 2^lgnT(n/2^lgn) + (1 - 2^lgn) / (1 - 2)
2^lgn = n so,
T(n) = nT(1) + n - 1
T(n) = n + n - 1 where n is the dominant term.
对于大师定理来说它真的很快
Consider, T(n) = aT(n/b) + n^c for n>1
有三种情况(注意b是对数基数)
(1) if logb a < c, T(n)=Θ(n^c),
(2) if logb a = c, T (n) = Θ(n^c log n),
(3) if logb a > c, T(n) = Θ(n^(logb a)).
在这种情况下,a = 2,b = 2,并且c = 0(n ^ 0 = 1)
快速检查显示案例3.
n^(log2 2)
note log2 2 is 1
So by master theorem this is Θ(n)
答案 1 :(得分:1)
除了主定理,递归树方法和迭代方法之外,还有 称为“替代方法”。
通常您会发现有人谈论
替代方法,实际上它们是指迭代方法(尤其是在Youtube上)。
我猜这源于以下事实:在迭代方法中,您也替换了
某事物,即第n+1
个第n
个递归调用...
有关算法的标准参考书 (CLRS) 定义如下:
替代方法
- 猜猜解决方案的形式。
- 使用数学归纳法找到常数,并证明该解决方案有效。
作为示例,让我们考虑您的递归方程:T(n) = 2T(ⁿ/₂)+1
我们猜想解决方案是T(n) ∈ O(n²)
,所以我们必须证明
T(n) ≤ cn²
代表某个常数c
。
另外,我们假设您为n=1
做着不停的工作c
。
给出:
T(1) ≤ c
T(n) = 2T(ⁿ/₂)+1
要证明:
∃c > 0, ∃n₀ ∈ ℕ, ∀n ≥ n₀, such that T(n) ≤ cn² is true.
基本案例:
n=1: T(1) ≤ c
n=2: T(2) ≤ T(1) + T(1) + 1 ≤ 4c
(≤c) (≤c) (cn²)
归纳步骤:
作为归纳假设,我们假设所有小于T(n) ≤ cn²
的正数为n
特别是对于(ⁿ/₂)
。
因此T(ⁿ/₂) ≤ c(ⁿ/₂)²
,因此
T(n) ≤ 2c(ⁿ/₂)² + 1 ⟵ Here we're substituting c(ⁿ/₂)² for T(ⁿ/₂)
= (¹/₂)cn² + 1
≤ cn² (for c ≥ 2, and all n ∈ ℕ)
因此我们已经证明,存在一个常量c
,使得T(n) ≤ cn²
对所有n ∈ ℕ
都是正确的。
这恰好意味着T(n) ∈ O(n²)
。 ∎
(对于Ω,因此对于Θ,证明是相似的)。