解决方案:T(n)=T(n-1)+T(n/2)+n。
我尝试使用递归树来解决这个问题。有两个分支T(n-1)
和T(n/2)
。 T(n-1)
会深入更高的深度。所以我们得到了O(2^n)
。这个想法正确吗?
解决方案:T(n)=T(n-1)+T(n/2)+n。
我尝试使用递归树来解决这个问题。有两个分支T(n-1)
和T(n/2)
。 T(n-1)
会深入更高的深度。所以我们得到了O(2^n)
。这个想法正确吗?
T(n) = T(n-1) + T(n/2) + n
大于 T(n) = T(n-1) + n
,它是O(n^2)。但从另一个角度看,这个 函数方程 有一个精确的解: T(n) = -2(n + 2)
。通过将该解代入到方程中可以轻松地验证其正确性: -2(n + 2) = -2(n + 1) + -(n + 2) + n
。我不确定这是否是唯一的解决方案。T(n) = T(n-1) + T(n/2) + n
。因为你要计算很大的 n
,所以 n-1
几乎与 n
相同。因此,您可以将其重写为 T(n) = T(n) + T(n/2) + n
,然后得到 T(n/2) + n = 0
,等价于 T(n) = -2n
,因此它是线性的。对我来说,这里带有负号是反直觉的,但是有了这个解决方案,我尝试了 T(n) = -2n + a
,并找到了a的值。T(n) = -2n
的计算意义是什么?通常当我说 T(n) = n
时,这意味着具有这种递归关系的算法在停止之前将执行确切的 n
个基本步骤(给定输入 n
)。那么 T(n) = -2n
是什么意思? - RitwikT(n) = T(n-1)+θ(n) = O(n^2)
和 T(n) = T(n/k)+θ(n) = O(n)
。所以我不相信 T(n) = T(n/2)+T(n-1)+θ(n)
将是 O(n^2)
,而且必须比这更高阶。这个链接 证明了它是 O(n^(log n))
。所以我认为答案是错误的。你能检查一下吗? - MsA我认为你是正确的。递归关系总是会分成两个部分,即T(n-1)和T(n/2)。看看这两个部分,显然n-1的值减少速度比n/2慢,或者换句话说,你将从树的n-1部分拥有更多的分支。尽管如此,在考虑大O符号时,只需要考虑“最坏情况”,在本例中即是两侧的树都减少n-1(因为它减速更慢,需要更多的分支)。总之,你需要将关系分成两个共n次,因此你说O(2 ^ n)是正确的。
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
which reduces to
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)
增长速度的好方法(我已经盯着它看了几个月)。我唯一可以结束的事情是引用另一个答案:“对于计算机科学课程来说,这是一个非常奇怪的递归”。
我认为我们可以这样看待它:
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)
T(n)=-2n+a
得到的确切解应该是 T(n) = -2(n+1)
而不是 T(n) = -2(n+2)
。T(n) = T(n-1) + T(n/2) + n 大于 T(n) = T(n-1) + n
以这种方式进行比较是没有意义的,因为这两个递归中的T(n)
不是相同的。记住 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
的函数的 O 定义,其中 a(>=2)
和 b
是正常数,您会发现这也不是一个可能的解,通过代换方法进行检验。
1/a+1/a^(n/2) <= 1
a^(n/2+1)-a^(n/2)-a >= 0
变量更改:
a^(N+1)-a^N-a >= 0
我们希望找到尽可能紧密的联系,因此我们正在寻找最小的a
。我们发现上面的不等式接受非常接近1的a
的解,但是a
是否允许无限接近1?答案是否定的,让a = (1+1/N)
。将a
代入不等式并应用极限N -> INF
:
e-e-1 >= 0
这是荒谬的。因此,上述不等式有一个固定的最大解N*
,可以通过计算找到。一个快速的Python程序让我发现a < 1+1e-45
(稍微外推一下),所以我们至少可以确定:
T(n) = ο((1+1e-45)^n)
T(n) = T(n-1) + T(n/2) + n
和 T(n)=T(n)+T(n/2)+n
是等价的,因为我们在求极大值的情况下。只有当 T(n/2) + n = 0
时,T(n)=T(n)+T(n/2)+n
才成立。这意味着 T(n) = T(n) + 0 ~= O(n)
。