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