时间复杂度和复发关系

时间:2017-10-20 22:59:41

标签: algorithm complexity-theory recurrence

我很难理解如何发展复发关系。我给出的代码是

 int result = bizarre(n, n);
 public static int bizarre (int first, int second)
 {
   if (second <= 1)
   {
     int temp = 0;
     for (int i = 0; i < first; i++)
         temp += i;
     return temp;
   }
   return bizarre (first, second-1);
 } 

从我的理解是

T(n) = n + 1
T(1) = 1

但这似乎并不合适。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

通常,递归关系由

给出
T(n) = no. of subproblems generated at each step * T(size of each subproblem) + complexity of the divide/conquer step

T(1) = complexity of base case(s)

在您的示例中,变量“second”在每次递归调用时变小1。此外,您在每个步骤创建的子问题的数量只有一个,因为您只调用该方法一次。

除了比较之外,代码在每个递归步骤中都没有真正做任何工作,因此这是一个O(1)操作。

所以,

T(n) = T(n - 1) + O(1)

最后,T(1)是在基本情况下发生的事情,它是n个数字的总和。

T(1) = O(n)

答案 1 :(得分:0)

我认为你遇到麻烦的原因之一是函数有两个独立的参数,所以你的递归关系需要有两个不同的参数来解释这个。

在第二个参数为0或1的情况下,您的工作与第一个参数成比例。你可以把它写成

  

T(m,1)=Θ(m)。

否则,该函数执行一定量的工作,然后对相同的第一个输入和递减的第二个输入进行递归调用。这是这样的:

  

T(m,n)= T(m,n-1)+ O(1)。

你认为你可以从那里解决问题吗?