在算法中未给出元素数量时计算时间复杂度

时间:2013-06-25 11:10:17

标签: algorithm recursion complexity-theory time-complexity recurrence

我想在链接列表中找到第i个位置的数据。我使用递归编写了这段代码:

NODE STRUCTURE:

struct Node
{
   int data;
   struct Node * next;
}

代码:

int i = 10;

int find ( Node * ptr, unsigned int count )
{
   if( nullptr == ptr )
   {
      ++ count;
      return count;
   }

   count = find ( ptr->next , count );
   if( i == count )
   {
      std::cout << "Successful here: " << ptr->data << std::endl; 
      exit ( -1 ) ;
   }

   else
   {
      ++ count;
      return count ;  
   }
}

我有使用递归关系计算时间复杂度的基本思路。但我无法写出这种关系本身。有人可以给出指示吗?

根据我的理解,我每次将问题分成少一个元素(通过移动到下一个节点)。

所以它应该像

T(n)= T(n-1)+常数

在这种情况下,Tree方法或任何其他方法可以更好吗?

1 个答案:

答案 0 :(得分:0)

这很简单。

您已经拥有了时间复杂度的序列

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

您还需要的是您的最终条件。 首先是你找到元素n。 第二个是你的数组只有m元素,其中m&lt; Ñ

因此,由于您的count每次迭代都在增加,我们必须将时间复杂度序列稍微更改为

T(i,c) = T(i-c, c+1) + Constant

这是因为您声明我是您想要找到的索引。

所以现在我们可以写第一个结束条件

T(0,i) = Constant

对于第二个结束条件与T(m,0)完全相同,所以如果我&gt;我们只是将i切换到m以获得复杂性。

现在假设Constant等于1.

然后我们得到以下等式

T(i,0) = T(i-0,1) +1 = T(i-1,2) +2 = T(i-2,3) +3 = T(i-3,4) +4 = .... = i+1

因此T((min(i,m),0) = i+1T(i,0)的复杂性为O(i)

您可以将代码更改为

int find ( Node * ptr, unsigned int i ){
       if( nullptr == ptr )
          return i;

       if( i == 0 )
       {
          std::cout << "Successful here: " << ptr->data << std::endl; 
          return 0;
       }
       return find ( ptr->next , --count );
    }

然后你会得到序列T(n) = T(n-1) + Constant