算法的递归关系

Recurrence relation of an algorithm

本文关键字:关系 递归 算法      更新时间:2023-10-16
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)

不用说,这是一个相当大的运行时!