void doSomething(int *a, int left, int right){
if (left == right){
for (int j = 0; i < right; ++j)
cout << a[j];
cout << endl;
return;
}
for (int i = left; i < right; ++i){
std::swap(a[left], a[i]);
doSomething(a, left + 1, right);
std::swap(a[left], a[i]);
}
}
“导出上述算法的递归关系。假设基本情况为T(1)= right。同时假设交换函数在O(1)时间内交换其两个参数的值并用于递归关系,T(n),令n =右 - 左+ 1。“
我们被要求找到上面给出的代码的递归关系。我们得出结论,只要左==右,第一个'if'语句就会打印出数组的内容。底部是递归语句,但我们不知道如何分析其复杂性。任何帮助将不胜感激!
答案 0 :(得分:1)
swap
无关紧要。它会影响打印的内容,但不会影响算法的运行时间。那么让我们来看看会发生什么:
致电doSomething(arr, j, j)
打印j
件事
致电doSomething(arr, i, j)
致电j-i
doSomething(arr, i+1, j)
。
让我们稍微重新定义变量并将f(i)
定义为doSomething(arr, j-i, j)
。那样f(0)
就是基本情况。现在,重复规则可以重写为:
来电f(i)
拨打i
来f(i-1)
。
这使得递归关系非常明确:
T(n) = n * T(n-1)
T(1) = O(n)
也就是说:
T(n) = O(n! * n)
毋庸置疑,这是一个非常大的运行时间!