Algorithm 如何计算该算法的最坏情况分析? sum=0; 对于(int i=0;i=0;j--) sum++;

Algorithm 如何计算该算法的最坏情况分析? sum=0; 对于(int i=0;i=0;j--) sum++;,algorithm,complexity-theory,big-o,big-theta,Algorithm,Complexity Theory,Big O,Big Theta,据我所知,第一行是1操作,第二行是(I+1)操作,第三行是(I-1)操作,第四行是n操作。这是否意味着运行时间将是1+(i+1)(i-1)+n?只是这些最后的步骤让我困惑。这不是加法:外循环的每次迭代都会发生一次内循环。所以是O(n2) 顺便说一句,这是一个很好的例子,说明了为什么我们对这类事情使用渐近表示法——根据“操作”的定义,计数的确切细节可能会有很大的不同。(比如,sum++是一个单独的操作,还是将sum加到1,给temp;load temp to sum?)但是既然我们知道所有可以隐藏

据我所知,第一行是1操作,第二行是
(I+1)
操作,第三行是
(I-1)
操作,第四行是
n
操作。这是否意味着运行时间将是
1+(i+1)(i-1)+n
?只是这些最后的步骤让我困惑。

这不是加法:外循环的每次迭代都会发生一次内循环。所以是O(n2)


顺便说一句,这是一个很好的例子,说明了为什么我们对这类事情使用渐近表示法——根据“操作”的定义,计数的确切细节可能会有很大的不同。(比如,
sum++
是一个单独的操作,还是
将sum加到1,给temp;load temp to sum
?)但是既然我们知道所有可以隐藏在常数因子中的东西,它仍然是O(n2)。

否;您不需要计算每行的特定操作数,然后将它们相加。像“for”这样的构造的全部要点是使给定的代码行可以多次运行。您应该使用思维和逻辑技能来计算“sum++”行作为N的函数将运行多少次。提示:每当遇到第三行时,它都会运行一次

第二行遇到了多少次

每次遇到第二行时,设置“i”的值。第三行使用该值i运行了多少次?因此,它将总共运行多少次?(提示:如果我在几个不同的场合给你不同的钱,你怎么知道我给了你多少钱?)

每次遇到第三行,第四行发生一次

哪一行最常发生?以N为单位,它发生的频率是多少?

从内到外工作

sum = 0;
for(int i = 0; i < N; i++)
    for(int j = i; j >= 0; j--)
       sum++;
这是一个单独的操作,因为它不会重复

sum++
这个循环i+1次。其中有几个操作,但您可能并不打算计算asm指令的数量。对于这个问题,我假设这是一个I+1的乘数。由于循环内容是单个操作,因此循环及其块执行i+1操作

for(int j = i; j >= 0; j--)
for(int i=0;i

这个循环N次。和以前一样,这是一个N的乘法器。因为块执行i+1操作,所以这个循环总共执行N(N+1)/2个操作。这就是你的答案!如果你想考虑Big-O复杂性,那么这简化为O(N2)。

< P>分析你不想逐行问的算法:“这个特定的行贡献多少时间?”原因是每一行不执行相同的次数。例如,与只运行一次的第一行相比,最内层的行执行了整整一次

要分析这样的算法,请尝试识别一些数值在算法总运行时间的常数因子内的数量。在这种情况下,该数量可能是“行
sum++
执行多少次?”,因为如果我们知道这个值,我们就知道算法中两个循环所花费的总时间。为了弄清楚这一点,让我们追踪一下这些循环会发生什么。在外部循环的第一次迭代中,
i==0
,因此内部循环将执行一次(从0到0倒计时)。在外循环的第二次迭代中,
i==1
,而内循环正好执行两次(首先是
j==1
,然后是
j==0
。更一般地说,在外循环的第k次迭代中,内循环执行
k+1
次。这意味着最内循环的总迭代次数由

for(int i = 0; i < N; i++)
此数量可以显示为等于

1 + 2 + 3 + ... + N
在这两个项中,
N^2/2
项是主要的增长项,因此如果我们忽略其常数因子,我们得到了O(N2)的运行时间


不要把这个答案看作是你应该记住的东西——想想得到答案所需的所有步骤。我们首先找到一些要计算的量,然后看看循环的执行对这个量的影响。从中,我们可以推导出这个量的数学表达式,然后对其进行简化.最后,我们得到了结果表达式并确定了主导项,它作为整个函数的大O。

那么猜猜你感兴趣的是sum++和执行它的次数

最后的统计数字会给你这个答案

实际上,您的循环只是:

西格玛(n)n从1变为n

这等于:
N*(N+1)/2
这给了你一个大的o符号
o(N^2)

此外,除了您的问题名称之外,您的算法中没有最坏的情况。
或者你可以说,最坏的情况是当N变为无穷大时。

使用西格玛符号表示循环:


您需要计算与N相关的复杂度,而不是与循环计数器相关的复杂度。
N (N + 1)      N^2 + N    N^2    N
---------   =  ------- =  --- + ---
    2             2        2     2