我正在研究递归关系
T(n) = T(3/4 * n) + O(1)
它出现了O(log(n))
,但事前我被告知解决方案是O(n)
。我找不到我出错的地方 - 这看起来就像二进制搜索的递归关系。有什么建议吗?
答案 0 :(得分:1)
尝试将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]
其中一个将收敛到一个小的正数,另一个将转为零或无穷大。
答案 1 :(得分:1)
T(n)= T(3/4 * n)+ O(1)...............(1) 在上面的eq。 T(3/4 * n)是未知的术语,如果你在询问这种复发的解决方案,那么我想说我们可以解决这个问题。使用替代方法。 在这里我们必须从主要方程式中找出T(3n / 4)的值。并在方程式中替换。递归。因为这种复发取决于递归。 N = 3N / 4 T(3n / 4)= T((3/4)^ 2 * n)+ c ...............(2)符号O由常数c代替。 现在替换(1)中的T(3n / 4) 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 ...............(4)
在第k步之后eq。将会 T(n)= T((3/4)^ k * n)+ kc ................(5)在此步骤n将为2或1(输入大小) ) (3/4)^ k * n = 1 n =(4/3)^ k,双面登录。 的log(n)= K *日志(4/3) k = log(n).............. 将价值放在eq。 (5) T(n)= T(1)+ log(n)* c ..............(6) T(n)= O(log n)
答案 2 :(得分:0)
给出的答案并未显示解决此类复发的正确方法。您可以使用Masters theorem以及a=1
和b=4/3
轻松解决案例。这意味着c = logb(a) = 0
。
由于您的f(n)
是一个常量,因此您属于第二个案例桶和k=0
。所以解决方案是,其中c = 0
和k = 0
。这意味着:
O(log(n))
是一个正确答案