Algorithm 这个算法的复杂性?
如果func2=O(n)和func3=O(n^2),func1的复杂度是多少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
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++;
}
}