Algorithm 这段代码的最坏情况分析正确吗? inta=0//1单位 对于(intb=0;b0;c--)//2+(N+1)+N=2N+3 a+=b*c//3个单位
收益率:Algorithm 这段代码的最坏情况分析正确吗? inta=0//1单位 对于(intb=0;b0;c--)//2+(N+1)+N=2N+3 a+=b*c//3个单位,algorithm,analysis,Algorithm,Analysis,收益率:1+(2n+1)(2n+3)=4n^2+8n+4 我是算法分析新手,我不能100%肯定这是正确的。谁能帮我一下,让我知道我做得对吗?如果没有,请指出我错在哪里 我大致计算了最坏情况下的运行时间为4n^2+8n+4对于外循环中的每个b值,内循环执行b+2次。因此,内部循环执行的总次数等于(2+3+4+…+(N+2))。每次执行3个工作单元。因此,内部循环执行的总时间是[((N+2)(N+3)/2)-1]*3 但一般来说,我们渐进地测量运行时间,结果是大O(N^2)内循环对外循环中的每个b值
1+(2n+1)(2n+3)=4n^2+8n+4
我是算法分析新手,我不能100%肯定这是正确的。谁能帮我一下,让我知道我做得对吗?如果没有,请指出我错在哪里
我大致计算了最坏情况下的运行时间为
4n^2+8n+4
对于外循环中的每个b值,内循环执行b+2次。因此,内部循环执行的总次数等于(2+3+4+…+(N+2))。每次执行3个工作单元。因此,内部循环执行的总时间是[((N+2)(N+3)/2)-1]*3
但一般来说,我们渐进地测量运行时间,结果是大O(N^2)内循环对外循环中的每个b值执行b+2次。因此,内部循环执行的总次数等于(2+3+4+…+(N+2))。每次执行3个工作单元。因此,内部循环执行的总时间是[((N+2)(N+3)/2)-1]*3
但通常我们渐进地测量运行时间,这会导致大O(N^2)通常,在使用时,忽略系数,并根据其最快增长函数对算法进行分类。在本例中,您有两个嵌套的
O(n)
循环。嵌套是乘法的,给出了算法O(n²)
aka‘二次’复杂度。Wikipedia关于和的文章可能会为您提供进一步阅读的起点。通常,在使用时,会忽略系数,并根据其增长最快的函数对算法进行分类。在本例中,您有两个嵌套的O(n)
循环。嵌套是乘法的,给出了算法O(n²)
aka‘二次’复杂度。Wikipedia关于和的文章可能会为您提供进一步阅读的起点。如果您想说内部循环中的语句需要3个单位,那么内部循环需要(b+2)*3个单位。现在,如果我们让b的范围从0到N-1,求和,我们得到
(0+2)*3+(1+2)*3+(2+2)*3+…+(2+N-1)*3
=3*(2+3+4+5+…+(N+1))
=3*((1+2+…+N+1)-1)
=3*((N+1)(N+2)/2)-1)
=3*(N^2+3*N+2-2)/2
=3/2*N^2+9/2*N
请注意,我没有将循环头中执行的操作计算为操作,这通常不会完成。事实上,人们通常只计算执行次数最多的最昂贵的操作(在本例中是乘法)
顺便说一下,我使用了前n个整数的和是n(n+1)/2这一事实,如果你想说内部循环中的语句需要3个单位,那么内部循环需要(b+2)*3个单位。现在,如果我们让b的范围从0到N-1,求和,我们得到 (0+2)*3+(1+2)*3+(2+2)*3+…+(2+N-1)*3 =3*(2+3+4+5+…+(N+1)) =3*((1+2+…+N+1)-1) =3*((N+1)(N+2)/2)-1) =3*(N^2+3*N+2-2)/2 =3/2*N^2+9/2*N 请注意,我没有将循环头中执行的操作计算为操作,这通常不会完成。事实上,人们通常只计算执行次数最多的最昂贵的操作(在本例中是乘法) 顺便说一下,我使用了前n个整数的和是n(n+1)/2这一事实,您的示例:
int a = 0; //1 unit
for (int b = 0; b < N; b++) // (1 + N + N) = 2n + 1
for (int c = b+2; c > 0; c--) //2 + (N+1) + N = 2N+3
a += b*c; //3 units
给我们举一个你的例子:
int a = 0; //1 unit
for (int b = 0; b < N; b++) // (1 + N + N) = 2n + 1
for (int c = b+2; c > 0; c--) //2 + (N+1) + N = 2N+3
a += b*c; //3 units
给我们<代码> o(n^ 3)< /> >
让我们考虑你的代码,= 1 + 1 + (N+1) + N + 1 + [(((N+2)*(N+3)/2)+1) + ((N+2)*(N+3)/2)) * N] + [3 * ((N+2)*(N+3)/2) * N]
= 4 + 2 N + 1/2 N^3 + 3 N^2 + 11/2 N + 4 + 9 N + 15/2 N^2 + 3/2 N^3
= 8 + 33/2 N + 21/2 N^2 + 2 N^3
for(int b=0;b0;c--)
a+=b*c;
外循环执行N次
,其中,对于外循环的每次迭代,内循环执行b+2次
因此,语句a+=b*c代码>总共执行2+3+4+…+N+2次
因此,指令总共执行([1+2+3+…+N+2]-1)
它等于[(N+2)(N+3)]/2-1
,因为前N个整数的和是N(N+1)/2
存在给定代码块的复杂性是<强>(((n2+5n+1)/2)-1)>这只是<强>席(n2)< /强> 让我们考虑一下你的代码
= 1 + 1 + (N+1) + N + 1 + [(((N+2)*(N+3)/2)+1) + ((N+2)*(N+3)/2)) * N] + [3 * ((N+2)*(N+3)/2) * N]
= 4 + 2 N + 1/2 N^3 + 3 N^2 + 11/2 N + 4 + 9 N + 15/2 N^2 + 3/2 N^3
= 8 + 33/2 N + 21/2 N^2 + 2 N^3
for(int b=0;b0;c--)
a+=b*c;
外循环执行N次
,其中,对于外循环的每次迭代,内循环执行b+2次
因此,语句a+=b*c代码>总共执行2+3+4+…+N+2次
因此,指令总共执行([1+2+3+…+N+2]-1)
它等于[(N+2)(N+3)]/2-1
,因为前N个整数的和是N(N+1)/2
因为给定代码段的复杂性是Θ((N2+5N+6)/2)-1,它只是Θ(N2)通常,循环被认为是O(n),而不是将其计算为2n+1
。你从哪里得到2n的?错了。它应该更像1+N*(N/2*3)=O(N²)
。如果你不知道O(•)部分是什么,你可以继续读下去。在评论中,我把for循环的每个部分需要多少个单位加起来,我现在假设这是错误的,所以第一个循环是N,然后第二个循环是(3N/2)?我知道你是怎么得到1+N的,但是最后一部分(N/2*3)你能解释一下你是怎么计算的吗?谢谢:)您的内部循环每次迭代执行3
个单位,并且b