Recursion 递推关系T(n)=T(3/4*n)和#x2B;O(1)
我正在计算递归关系Recursion 递推关系T(n)=T(3/4*n)和#x2B;O(1),recursion,complexity-theory,recurrence,Recursion,Complexity Theory,Recurrence,我正在计算递归关系 T(n)=T(3/4*n)+O(1) 结果是O(log(n)),但我事先被告知解决方案是O(n)。我找不到哪里出错了-这看起来就像二进制搜索的递归关系。有什么建议吗?尝试将T(n)=c*n或T(n)=c*logn代入方程并求解。这两个方程中有一个是可解的 您还可以通过计算函数的不同值n来检查答案 -- Define T in your preferred language t n | n <= 1 = 1 | otherwise = t (3/4 * n) + 1 -
T(n)=T(3/4*n)+O(1)
结果是O(log(n))
,但我事先被告知解决方案是O(n)
。我找不到哪里出错了-这看起来就像二进制搜索的递归关系。有什么建议吗?尝试将T(n)=c*n
或T(n)=c*logn
代入方程并求解。这两个方程中有一个是可解的
您还可以通过计算函数的不同值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
t nt(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
现在将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步后,等式将为
T(n)=T((3/4)^k*n)+kc………..(5)在此步骤中,n将为2或1(输入大小)
(3/4)^k*n=1
n=(4/3)^k,从两侧取对数。
对数(n)=k*log(4/3)
k=对数(n)。。。。。。。。。。。。。。
将值放入式(5)中
T(n)=T(1)+对数(n)*c………..(6)
T(n)=O(logn)给出的答案没有显示解决此类复发的正确方法。您的案例很容易用a解决,在您的案例中a=1
和b=4/3
。这意味着c=logb(a)=0
因为你的f(n)
是一个常数,所以你落在第二种情况下,其中k=0
。因此,解决方案是,其中c=0
和k=0
。这意味着:
O(log(n))
是一个正确的答案或者,我预先给出的答案可能是错误的,只是想找出是哪一个。