【问题标题】:Find recurrence relation of this algorithm?找到这个算法的递归关系?
【发布时间】:2010-02-04 06:36:23
【问题描述】:

假设n=B-A+1,我需要推导这个算法的递推关系:

void recurringalgorithm(int *a, int A, int B){
  if (A == B){
    for (int j=0;j<B;j++){
      cout<<a[j];  
    }
    cout<<endl;
    return;
  }
  for (int i=A;i<B;i++){
    dosomething(a[A],a[i]);
    recurringalgorithm(a,A+1,B);
    dosomething(a[A],a[i]);
  }
}

帮助?

【问题讨论】:

  • 这是作业还是面试题?你确定是(a, A+1, B)而不涉及i吗?
  • 这是一道作业题,没错,是A+1,不是A+i。
  • 哎呀,你是对的。我的错。它是 B-A+1。帖子已相应更改

标签: algorithm big-o recurrence


【解决方案1】:

假设递归算法的复杂度为h(A,B)

从您的代码中,您可以将h 分成两种情况:

h(A,B) = { complexity-of-if-branch          if A = B
         { complexity-of-rest-of-the-code   otherwise

“如果分支的复杂性”是微不足道的。对于“代码复杂度”,由于涉及到recurringalgorithm,因此需要再次包含h

例如,如果函数定义如下

function hh(A,B) {
    for (var i = A+1; i < B; ++ i)
        hh(i, B);
}

那么复杂度会是

hh(A,B) = hh(A+1, B) + hh(A+2, B) + ... + hh(B-1, B)

您可以将此与您的代码进行比较以进行概括。

(顺便说一句,复杂度是h(A,B) = O(B * (B-A)!)

【讨论】:

  • 谢谢,所以在计算整体 big-o 复杂度时,if-branch 的复杂度可以忽略不计?
  • @zebraman:不,“如果分支的复杂性”负责 O(B * (B-A)!) 中的“B”因素。
  • 每当我看到一个“!”在复杂的情况下,我哭了......幸好这只是家庭作业!
猜你喜欢
  • 2021-02-04
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多