算法的递归关系

时间:2015-01-30 03:09:50

标签: c++ algorithm recursion recurrence

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'语句就会打印出数组的内容。底部是递归语句,但我们不知道如何分析其复杂性。任何帮助将不胜感激!

1 个答案:

答案 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)拨打if(i-1)

这使得递归关系非常明确:

T(n) = n * T(n-1)
T(1) = O(n)

也就是说:

T(n) = O(n! * n)

毋庸置疑,这是一个非常大的运行时间!