我有以下代码。应该采用什么递归关系以及它的复杂性。如果你可以通过使用替换方法解决递归关系来帮助我找到它的复杂性,那将是非常好的。
用于存储多个返回值的节点变量
struct node
{
int MAXX;
int MINN;
}NODE;
递归函数,用于查找给定数组的最小和最大数字
struct node partition(int a[], int first, int last)
{
int MAX, MIN;
int low = first;
int high = last;
struct node left, right;
/*If there is a single variable */
if (low==high)
{
NODE.MAXX = a[low];
NODE.MINN = a[low];
return(NODE);
}
/*If there exists only 2 elements*/
else if (high==low+1)
{
if (a[high]>a[low])
{
NODE.MAXX = a[high];
NODE.MINN = a[low];
}
else
{
NODE.MAXX = a[low];
NODE.MINN = a[high];
}
return NODE;
}
/*If there exists more than 2 elements */
int mid = (low + high) / 2;
left=partition(a, low, mid);
right=partition(a, mid+1, high);
if (left.MAXX > right.MAXX)
NODE.MAXX = left.MAXX;
else
NODE.MAXX = right.MAXX;
if (left.MINN < right.MINN)
NODE.MINN = left.MINN;
else
NODE.MINN = right.MINN;
return NODE;
}
主要功能
int _tmain(int argc, _TCHAR* argv[])
{
struct node N;
int a[] = { 70, 50, 111, 69, 4, 7, 80, 100 };
N=partition(a, 0, 7);
cout << "Maximum = " << N.MAXX << endl;
cout << "Minimum = " << N.MINN << endl;
}
答案 0 :(得分:1)
对partition
的每次调用都会执行一定量的工作,再加上2个额外的递归调用,每个调用都有输入索引范围的一半。因此,我们可以为时间复杂度函数构建递归关系:
T(n) = 2T(n/2) + C
这扩展为一个几何系列C * (1 + 2 + 4 + ... )
,它继续log n
项(因为在每个递归级别,输入大小减半,因此它在几何上减少到停止条件n = 2
) 。从标准公式中,这相当于O(n)
。
编辑:改进前面解释的等式: