我在今年10月开始获得生物信息学硕士学位,因为一位前生物学家从一段代码中发现一个递归方程非常困难。如果有人能向我解释这一点,我将非常感激。
如何从这段代码中找到递归方程?
procedure DC(n)
if n<1 then return
for i <- 1 to 8 do DC(n/2)
for i <- 1 to n³ do dummy <- 0
我的猜测是T(n)= c + 8T(n / 2),因为第一个if条件需要恒定时间c而第一个for循环是从1到8执行的递归情况,因此8 * T( n / 2),但我不知道如何将最后一行代码添加到我的等式中。
答案 0 :(得分:1)
你很亲密,但事实并非如此。
通常,递归关系仅描述递归过程的递归步骤所完成的工作,因为假设基本情况执行了一定量的工作。你想看看
您已正确识别出大小为n / 2的输入上有8个递归调用,因此8T(n / 2)项是正确的。但是,请注意,这是一个执行O(n 3 )工作的循环。因此,您的递归函数可以更准确地建模为
T(n)= 8T(n / 2)+ O(n 3 )。
然后值得一看,你是否可以争论为什么这种复发解决了O(n 3 log n)。
答案 1 :(得分:0)
原来是T(n)= 8*T(n/2)+O(n^3)
。
我会用迭代/递归树方法解决这个问题。
T(n) = 8* T(n/2) + O(n^3)
~ 8* T(n/2) + n^3
= 8*(8* T(n/4) + (n/2)^3))+n^3
= 8^2*T(n/4)+8*(n/2)^3+ n^3
= 8^2*T(n/2^2)+n^3+n^3
= 8^2( 8*T(n/8)+(n/4)^3)+n^3+n^3
= 8^3*T(n/2^3)+ n^3 + n^3 + n^3
...
= 8^k*T(n/2^k)+ n^3 + n^3 + n^3 + ...k time ...+n^3
这将在n/2^k=1 or k=log_2(n)
。
因此复杂性为O(n^3log(n))