我想在链接列表中找到第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方法或任何其他方法可以更好吗?
答案 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+1
或T(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