我正在锻炼复发关系

T(n) = T(3/4 * n) + O(1)

它是 O(log(n)), ,但事先我被告知解决方案是 O(n). 。我找不到我要在哪里出错的地方 - 这看起来像是二进制搜索的复发关系。有什么建议么?

有帮助吗?

解决方案

尝试替换 T(n) = c*n 或者 T(n) = c * log n 进入方程式和求解。两个方程之一将是可以解决的。

您还可以通过评估n的不同值来检查答案。

-- Define T in your preferred language
t n | n <= 1 = 1 | otherwise = t (3/4 * n) + 1

-- If it's O(log n), then T(n)/log(n) should be asymptotically constant
-- If it's O(n), then T(n)/n should be asymptotically constant
check1 n = t n / log n
check2 n = t n / n

print [check1 1e10, check1 1e11, check1 1e12, check1 1e13]
print [check2 1e10, check2 1e11, check2 1e12, check2 1e13]

其中一个会收敛到一个较小的正数,另一个将趋于零或无穷大。

其他提示

t(n)= t(3/4 * n) + o(1)......................................................................................................................................................................................................................................... t(3/4 * n)是未知的术语,如果您询问了此复发的解决方案,那么我想说我们可以解决此方程。使用替代方法。在此,我们必须从主等式中找出t(3n/4)的值。并在等式中代替。递归。由于这种复发取决于递归。 n = 3n/4 t(3n/4)= t((3/4)^2 * n)+ c ...................................................................(2)符号o被常数c代替。现在替换t(3n/4)在(1)t(n)= t((3/4)^2 * n) +2c .................................................................................(3)现在将n =((3/4)^2 * n)置于(1)t((3/4)^2 * n)= t((3/4)^3 * n)+c替代t(n )= t((3/4)^3 * n)+3C ..................................................................................................................................................

在KTH步骤等式之后。将为t(n)= t((3/4)^k * n)+kc .....................................................................................................................................输入大小)(3/4)^k * n = 1 n =(4/3)^k,通过在两侧进行登录。 log(n)=k*log(4/3) k=log(n) .............. place value in eq. (5) T(n)=T(1)+log(n) * c ..............(6) T(n)= O(log n)

给出的答案并未显示出解决此类复发的正确方法。您的情况很容易解决 大师定理 在你的情况下 a=1b=4/3. 。这意味着 c = logb(a) = 0.

因为你 f(n) 是一个常数,您属于第二个情况桶,哪里 k=0. 。因此解决方案是 enter image description here, , 在哪里 c = 0k = 0. 。这意味着:


O(log(n)) 是正确的答案

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top