解决:T(n)= T(n-1)+ T(n / 2)+ n 。
我尝试使用递归树来解决这个问题。分别有两个分支T(n-1)
和T(n/2)
。 T(n-1)
会更深入。所以我们得到O(2^n)
。这个想法是否正确?
答案 0 :(得分:5)
不,你的想法不正确。复杂性是O(n)
我也必须承认这个问题很难。
这是一个解决方案。 T(n) = T(n-1) + T(n/2) + n
。由于您计算的内容非常大n
,因此n-1
与n
几乎相同。因此,您可以将其重写为T(n) = T(n) + T(n/2) + n
在这里我犯了一个错误,错误的解决方案开始了:
是T(n) = 1/2 * T(n/2) + n/2
。如您所见,这种递归的复杂性将比原始递归复杂得多。
请注意,您不能在此处使用Master's定理,因为a < 1
。
您可以开始展开递归。
最后一次求和转换,因为它是几何级数。因此,递归将在某个时间停止,您可以选择某个时间点。我在T(1) = b
时选择了它。这种情况发生在n/2^k = 1
或n = 2^k
,这意味着k = log n
。
如果您将在递归中替换此k
,则最大元素将以O(n)
运行,因此这是此等式的运行时间。
错误结束,正确开始
是T(n/2) + n = 0
,等于T(n) = - 2n
,因此它是线性的。这对我来说是违反直觉的(这里是减号),但是有了这个解决方案,我发现functional equation T(n)=T(n-1)+T(n/2)+n
的解决方案非常接近-2n - 2
。
如果您将其插入等式中,您会看到对于任何n
它只有1关闭。所以解决方案仍然是O(n)
P.S。再一次,CS类的一个非常奇怪的递归。
答案 1 :(得分:0)
你的推理是正确的,但你放弃的太多了。 (例如,说2x^3+4=O(2^n)
也是正确的,但这不像2x^3+4=O(x^3)
那样有用。)
我们要做的第一件事就是摆脱不均匀的术语n
。这表明我们可能会寻找T(n)=an+b
形式的解决方案。用它代替,我们发现:
an+b = a(n-1)+b + an/2+b + n
减少到
0 = (a/2+1)n + (b-a)
暗示a=-2
和b=a=-2
。因此,T(n)=-2n-2
是等式的解决方案。
我们现在想通过减去我们已经找到的解决方案来寻找其他解决方案。我们来定义U(n)=T(n)+2n+2
。等式变为
U(n)-2n-2 = U(n-1)-2(n-1)-2 + U(n/2)-2(n/2)-2 + n
减少到
U(n) = U(n-1) + U(n/2).
U(n)=0
是这个等式的一个明显的解决方案,但是这个等式的非平凡解决方案如何表现?
我们假设某些U(n)∈Θ(n^k)
为k>0
,因此U(n)=cn^k+o(n^k)
。这使得等式
cn^k+o(n^k) = c(n-1)^k+o((n-1)^k) + c(n/2)^k+o((n/2)^k)
现在,(n-1)^k=n^k+Θ(n^{k-1})
,以便上述内容成为
cn^k+o(n^k) = cn^k+Θ(cn^{k-1})+o(n^k+Θ(n^{k-1})) + cn^k/2^k+o((n/2)^k)
吸收低阶项并减去常用cn^k
,我们到达
o(n^k) = cn^k/2^k
但这是错误的,因为右手边比左边增长得快。因此,U(n-1)+U(n/2)
增长速度超过U(n)
,这意味着U(n)
必须比我们假设的Θ(n^k)
增长得更快。由于任何k
都适用,U(n)
必须比任何多项式都快。
比任何多项式增长更快的事物的一个很好的例子是指数函数。因此,我们假设某些U(n)∈Θ(c^n)
为c>1
,因此U(n)=ac^n+o(c^n)
。这就是方程式
ac ^ n + o(c ^ n)= ac ^ {n-1} + o(c ^ {n-1})+ ac ^ {n / 2} + o(c ^ {n / 2})
重新排列并使用某些增长数学顺序,这就变成了
c^n = o(c^n)
这是错误的(再次),因为左手边比右边增长得快。因此,
U(n)
的增长速度超过U(n-1)+U(n/2)
,这意味着U(n)
的增长速度必须慢于我们假设的Θ(c^n)
。由于任何c>1
都是如此,U(n)
必须比任何指数增长更慢。
这使我们进入准多项式的领域,其中ln U(n)∈O(log^c n)
和次指数,其中ln U(n)∈O(n^ε)
。其中任何一个都意味着我们要查看L(n):=ln U(n)
,其中前面的段落暗示L(n)∈ω(ln n)∩o(n)
。根据我们方程的自然对数,我们有
ln U(n) = ln( U(n-1) + U(n/2) ) = ln U(n-1) + ln(1+ U(n/2)/U(n-1))
或
L(n) = L(n-1) + ln( 1 + e^{-L(n-1)+L(n/2)} ) = L(n-1) + e^{-(L(n-1)-L(n/2))} + Θ(e^{-2(L(n-1)-L(n/2))})
所以一切都归结为:L(n-1)-L(n/2)
增长的速度有多快?我们知道L(n-1)-L(n/2)→∞
,否则L(n)∈Ω(n)
。 L(n)-L(n/2)
可能同样有用,因为L(n)-L(n-1)∈o(1)
远小于L(n-1)-L(n/2)
。
不幸的是,这是我能够解决问题的方法。我没有看到控制L(n)-L(n/2)
增长速度的好方法(我几个月来一直盯着这个)。我唯一可以结束的是引用另一个答案:“CS类的一个非常奇怪的递归”。
答案 2 :(得分:0)
我认为我们可以这样看:
T(n)=2T(n/2)+n < T(n)=T(n−1)+T(n/2)+n < T(n)=2T(n−1)+n
如果我们应用大师定理,则:
Θ(n∗logn) < Θ(T(n)) < Θ(2n)
答案 3 :(得分:0)
请记住,T(n) = T(n-1) + T(n/2) + n
比T(n) = T(n-1) + n
大(渐近)仅适用于渐近为正的函数。在这种情况下,我们有T = Ω(n^2)
。
请注意,T(n) = -2(n + 2)
是泛函方程的一个解,但它对我们不感兴趣,因为它不是渐近正解的解决方案,因此O的表示法不是有有意义的应用。
您还可以轻松检查T(n) = O(2^n)
。 (如果需要,请参考yyFred解决方案)
如果您尝试对类型为n^a(lgn)^b
且具有a(>=2)
和b
正常数的函数使用O的定义,您会发现Substitution也不可行方法。
实际上,唯一允许使用Substitution Method进行证明的函数是指数函数,但是我们知道该递归的增长速度不如T(n) = 2T(n-1) + n
快,因此,如果T(n) = O(a^n)
,我们可以a < 2
。
假设 我们可以通过将假设更改为低阶项来轻松摆脱n。重要的是: 更改变量: 我们希望找到一个尽可能紧密的键,因此我们正在寻找最低的 这是荒谬的。因此,上面的不等式具有某个固定数T(m) <= c(a^m)
(对于某些常数c)是实数和正数。我们的假设是该关系对所有m T(n) <= (1/a+1/a^(n/2))c(a^n) + n
1/a+1/a^(n/2) <= 1
a^(n/2+1)-a^(n/2)-a >= 0
a^(N+1)-a^N-a >= 0
a
。我们在上面发现的不等式接受a
的解,该解非常接近1,但是a
是否可以任意接近1?答案是否定的,让a
的格式为a = (1+1/N)
。将a
替换为不等式并应用限制N -> INF
:e-e-1 >= 0
N*
作为最大解,可以通过计算找到。一个快速的Python程序使我能够找到a < 1+1e-45
(稍作推断),因此我们至少可以确定:T(n) = ο((1+1e-45)^n)
答案 4 :(得分:-3)
T(n)=T(n-1)+T(n/2)+n
与T(n)=T(n)+T(n/2)+n
相同,因为我们正在解决n的极大值。 T(n)=T(n)+T(n/2)+n
只有在T(n/2) + n = 0
时才能为真。这意味着T(n) = T(n) + 0 ~= O(n)