Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何从递归算法中求递推关系_Algorithm_Recursion_Iteration_Recurrence - Fatal编程技术网

Algorithm 如何从递归算法中求递推关系

Algorithm 如何从递归算法中求递推关系,algorithm,recursion,iteration,recurrence,Algorithm,Recursion,Iteration,Recurrence,我知道如何从简单的递归算法中找到递归关系 For e.g. QuickSort(A,LB, UB){ key = A[LB] i = LB j = UB + 1 do{ do{ i = i + 1 }while(A[i] < key) do{ j = j - 1 }while(A[j] > key) if(i < j){

我知道如何从简单的递归算法中找到递归关系

For e.g. 
QuickSort(A,LB, UB){
    key = A[LB]
    i = LB
    j = UB + 1
    do{
        do{
            i = i + 1
        }while(A[i] < key)
        do{
            j = j - 1
        }while(A[j] > key)
    if(i < j){
        swap(A[i]<->A[j])
    }while(i <= j)
    swap(key<->A[j]
    QuickSort(A,LB,J-1)
    QuickSort(A,J+1,UB)
}

T(n) = T(n - a) + T(a) + n
首先,所以你不应该期望有一个简单的规则涵盖所有这些

这就是说,我认为对你有帮助的一件事是更多地关注你传递给你的算法的输入的结构,而不是你自己的算法。例如,考虑你在帖子中显示的快速排序。如果你扫一眼那些嵌套的do,你可能会猜到它的O(N^2),而实际上它是O(N)。通过查看输入更容易找到真正的答案:i总是增加,j总是减少,当它们最终相遇时,数组的N个索引中的每一个都会被访问一次

另外,我不知道如何找到算法的递推关系,其中有多个参数在增加或减少

e.g.
unsigned greatest_common_divisor (const unsigned a, const unsigned b)
{
  if (a > b)
  {
    return greatest_common_divisor(a-b, b);
  }
  else if (b > a)
  {
    return greatest_common_divisor(a, b-a);
  }
  else // a == b
  {
    return a;
  }
}

嗯,这些算法肯定比单变量算法更难。对于您作为示例使用的欧几里德算法,其复杂性实际上是要计算出来的,它涉及到考虑最大公约数,而不是仅仅查看算法实现的源代码。

我建议您首先根据需要找到递归关系,然后开发算法(类似于动态规划的迭代或递归)而不是相反。算法分析不是一门科学。通用的递归分析方法无法确定
最大公因数
的递归调用数大致是a/b连分数表示的系数之和。
e.g.
unsigned greatest_common_divisor (const unsigned a, const unsigned b)
{
  if (a > b)
  {
    return greatest_common_divisor(a-b, b);
  }
  else if (b > a)
  {
    return greatest_common_divisor(a, b-a);
  }
  else // a == b
  {
    return a;
  }
}