算法

时间:2017-11-11 15:13:47

标签: algorithm recursion pseudocode recurrence

我在今年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),但我不知道如何将最后一行代码添加到我的等式中。

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))