算法的递归关系
Recurrence relation of an algorithm
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) = 右。还假设交换函数在 O(1) 时间内交换其两个参数的值,对于递归关系 T(n),设 n = 右-左+1。
我们被要求找到上面给出的代码的递归关系。我们能够得出结论,第一个"if"语句只是在 left == right 时打印出数组的内容。底部是一个递归语句,但我们不知道如何分析它的复杂性。任何帮助将不胜感激!
swap
无关紧要。它会影响打印的内容,但不会影响算法的运行时。因此,让我们看看会发生什么:
调用doSomething(arr, j, j)
打印j
内容。
呼叫doSomething(arr, i, j)
对doSomething(arr, i+1, j)
进行j-i
呼叫。
让我们稍微重新定义变量并将f(i)
定义为doSomething(arr, j-i, j)
。这样f(0)
就是基本情况。现在,重复规则可以重写为:
呼叫f(i)
对f(i-1)
进行i
呼叫。
这使得递归关系非常清楚:
T(n) = n * T(n-1)
T(1) = O(n)
也就是说:
T(n) = O(n! * n)
不用说,这是一个相当大的运行时!
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 如何记住这种递归关系?
- 关于记忆后这种递归关系的时间复杂度
- 如何从算法中找到递归关系
- 同一生成文件中的 make 目标之间的递归依赖关系
- C++:类型别名中的递归依赖关系
- 算法的递归关系