Algorithm for-loop分析

Algorithm for-loop分析,algorithm,asymptotic-complexity,Algorithm,Asymptotic Complexity,考虑这段代码 int sum = 0; for( int i = 1; i <= n*n; i = i*2 ){ sum++ ; } 如何对其进行快速正确的分析,以获得最坏情况下运行时间的增长顺序 将increment语句更改为i=i*3而不是i=i*2如何更改最坏情况下的运行时间 将比较运算符更改为是否会影响我们的分析?实际上,这个循环是infinte循环 i=0 i=i*2 //0*2=0 所以这个循环永远不会结束。使i=1,得到2的幂的计数,直到n^2不求和。对于任何循环

考虑这段代码

int sum = 0;
for( int i = 1; i <= n*n; i = i*2 ){
   sum++ ;
}
如何对其进行快速正确的分析,以获得最坏情况下运行时间的增长顺序

将increment语句更改为i=i*3而不是i=i*2如何更改最坏情况下的运行时间


将比较运算符更改为是否会影响我们的分析?实际上,这个循环是infinte循环

i=0
i=i*2  //0*2=0

所以这个循环永远不会结束。使i=1,得到2的幂的计数,直到n^2不求和。

对于任何循环,分析它。你必须看到两件事。使其退出的条件,以及应用于该条件中使用的变量的迭代

为您的代码。你可以注意到,当我从0到n*n^2时,循环停止。变量i在增加,就像i=i*2。当i以这种方式增加i时,循环将运行日志n^2次。这可以通过取n^2的示例值(如128)看到,然后逐个手动迭代

int sum = 0;
for( int i = 0; i <= n*n; i = i*2 ){
   sum++ ;
}
我们可以对复杂性进行如下分析:

让循环运行k-1次,并在i的第k次更新时终止。 既然重复比不清楚要好,下面是正在发生的事情:

Init1->test1->Loop1[i=1]-> Update2->test2->Loop2[i=2]-> ... Updatek-1->testk-1->Loopk-1[i=2^k-2]-> Updatek->testk->STOP[当我变成2^k-1时测试失败]

其中Updatek表示第k次更新i=i*2

由于i中的增量是这样的,在pth循环中或等效地,在pth更新之后,i的值将是2^p-1,因此我们可以说在终止时:

2 ^ (k - 1) > (n * n)
详细地说,我们已经在第k次更新时终止。无论i的值是多少,它都会大于n*n,否则我们就会进入第k个循环。在两侧取原木底座2:

 k ~ 2 * log(n)
这意味着k是一个Ologn

等效地,循环运行的次数为Ologn

你可以很容易地将这个概念扩展到任何极限,比如n*n*n和任何增量i*3,i*4等等


大O的复杂性将不受使用的影响。这应该是一个评论,而不是一个答案。对于少于50人的人来说很难评论。我没有足够的特权。谢谢@Damian指出。对不起,我把它改为从i=1开始,不是0,这是我的错,对不起!我不明白你的问题。。。你是在问这个循环在做什么,如果你用i*3替换i*2,然后<用可能的重复项替换i*3,它将如何运行?我想得到最坏情况下运行时间的增长顺序谢谢@axiom:got。。但我想知道是否有分析的方法
 k ~ 2 * log(n)