Algorithm 这个算法的复杂性?

Algorithm 这个算法的复杂性?,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,如果func2=O(n)和func3=O(n^2),func1的复杂度是多少 void func1(int n){ int i,j,k; 对于(k=0;k0;k--) 功能2(n); 对于(j=n;j>1;j--)//O(n) func3(n);//O(n^2) i++; } } 那就是O(n^2)O(n)O(n)+O(n)=max(O(n^4),O(n))=O(n^4 谢谢 void func1(int n){ void func1 (int n) { int i, j, k; fo

如果func2=O(n)和func3=O(n^2),func1的复杂度是多少

void func1(int n){
int i,j,k;
对于(k=0;k0;k--)
功能2(n);
对于(j=n;j>1;j--)//O(n)
func3(n);//O(n^2)
i++;
}
}
那就是O(n^2)O(n)O(n)+O(n)=max(O(n^4),O(n))=O(n^4

谢谢

void func1(int n){
void func1 (int n) {
  int i, j, k;
  for (k=0;k<n;k++)       
      printf("%d",k);
  i=0;
  while (i<2*n) {             // O(2*n) = O(n)
    for (j=i;j>1;j--)           // O(n)
        for (k=15;k>0;k--)        // O(15) = O(1)
            func2(n);               // O(n)
    for (j=n;j>1;j--)           // O(n) 
        func3(n);                 // O(n^2)
    i++;
  }
}
int i,j,k; 对于(k=0;k0;k--)//O(15)=O(1) func2(n);//O(n) 对于(j=n;j>1;j--)//O(n) func3(n);//O(n^2) i++; } }
对于序列,找到最大步数


根据经验,嵌套循环会成倍增加,但如果它们不是独立的,则可能需要仔细检查范围以确保情况属实(请参见Paul的评论以获取示例)。

您认为如何以及为什么?我得到了O(n^4)由于func2没有被执行,func3处于两个循环下:最内部的从2到n,另一个从0到2n-1。
printf(“%d”,k)
是O(log(k)),而不是O(1),这使得第一个循环O(log(n!)=O(n log n),尽管这一次对func1的整体复杂性没有任何影响,因为第一个循环由第二个循环控制。O(n^2)O(n)O(n)=O(n^4)?书awnser是O(n^3)真的吗?哪本书?@梯形图?这本书是如何解释它的结果的?嵌套循环的复杂性一般不会成倍增加,尽管这个伪方法恰好给出了正确的结果。例如,如果将
i=0
替换为
i=1
,将
i++
替换为
i*=2
,则func2的总成本计算为O(n^2),即使外部循环运行了
O(log n)
次。@Paulin我已经澄清了答案。你能解释一下你的例子吗?对于我来说,似乎还不太清楚为什么在您的情况下func2的运行时不是O(n^2 log n)。@StefanHaustein因为
j
循环运行
i
次,而不是
n
。然后(为了简单起见,假设n是2的幂)func2被称为15*(1+2+4+8+…+n)=15*(2n)=30n次,因此复杂度为O(n^2)。通常,如果嵌套循环的范围是独立的,则可以对其进行乘法,但在特定情况下(例如:i=1…n,j=1..i),它恰好起作用,因为sum(i表示i=1..n)=n(n+1)/2=O(n^2)。
void func1 (int n) {
  int i, j, k;
  for (k=0;k<n;k++)       
      printf("%d",k);
  i=0;
  while (i<2*n) {             // O(2*n) = O(n)
    for (j=i;j>1;j--)           // O(n)
        for (k=15;k>0;k--)        // O(15) = O(1)
            func2(n);               // O(n)
    for (j=n;j>1;j--)           // O(n) 
        func3(n);                 // O(n^2)
    i++;
  }
}