当前位置: 首页 > 知识库问答 >
问题:

内环依赖外环的嵌套for循环的时间复杂度

艾焱
2023-03-14

我有一个嵌套的for循环:

for(i = 0; i < n*n; i++)
   for(j = 0; j <= i/5; j++)
      print("Hello World!");

如何找到这个循环的时间复杂度。

我在考虑外部循环,它从0运行到n^2(独占),所以它运行n^2 1次。

对于内部循环,它取决于i,这就是我迷失的地方。有什么指示吗?

共有1个答案

徐昕
2023-03-14

几乎总是你可以插入常识告诉你包含最坏情况的数字。除非所说的最坏情况保证无论N次都只运行固定的次数(即所有循环都接近最佳,除了最多5个循环不是,即使我们循环一千次——非常罕见)——那么就用最坏的情况做数学。

这适用于每个单独的循环:取每个循环的最坏情况。这是正确的,除非循环之间有联系,例如,如果内部循环运行“最坏情况”,只有当某些外部循环保证运行最佳情况时,反之亦然——当有明确的关系时。

那么,让我们在这里应用它:

  • 我从0到n*n,这部分很简单
  • j从0运行到i(我们可以忽略常数因子,所以/5部分是不相关的,我们可以忽略它)

j循环的最坏情况是i等于n*n,这使得j从0运行到n*n。我们就用这个吧。

这实际上是正确的答案;这是一个运行n*n迭代的循环(这是j循环),并且这个过程重复n*n次(i循环),总复杂度为O(n^4)(哎哟,随着n的增长,它会很快消失)。

如果你不确定数学是否正确,试着找出线性。这就保证了。在这种情况下,最好的情况是当i为0时,在这种情况下,j循环只运行一次,而最坏的情况是j循环运行n*n次。关键的是,j循环的特性是线性的:只要画出在i循环的“生命周期”内j循环的性能会发生什么,这是一个简单的直线关系。第一个5J循环运行一次,第二个5J循环运行两次,一直到最后一个j循环运行n*n/5次。

所有j循环的“平均值”仅为该行的中间值:n*n/5的一半。这是n*n/10,常数因子并不重要,所以这仍然是n*n。因此,为什么这是O(n^4),与(j=0;j)的相同

 类似资料:
  • 这是一个正常的嵌套循环,具有复杂性 我很难理解为什么下一个循环也有复杂性,即使它打印的语句更少 有什么想法吗?

  • 以下示例循环的时间复杂度为O(n^2),有人能解释为什么是O(n^2)吗?因为这取决于c的价值。。。 循环1--- 回路2--- 如果c=0;然后它运行无限次,就像增加c值一样,内部循环的运行次数也会减少 有人能给我解释一下吗?

  • 我正在努力找到确切的答案 我知道外环运行了n次。然后,第二个循环每次运行的次数不同,因为它从i开始: n(n-1)(n-2)。。。2 1. 但是,因为我们只关心最坏的情况(当i=n时),所以第二个循环将运行n-n次,因为它将从i=n开始。这当然没有意义,但这就是我被卡住的地方。我已经运行了这段代码,找到了序列的前四个元素:S=0 1 4 10。。。(其余部分不确定)。 抱歉,如果这不合理,但任何帮

  • 有三个嵌套的循环,如果循环增量为1,我可以找到复杂性,但是如果循环增量像这样i=c,我就糊涂了? 第三个for循环的复杂度是m,但第一个for循环的复杂度是n/c,第二个for循环的复杂度是n==

  • 这个问题是为了修改过去的试卷,如果我走上了正确的道路,我需要一些建议。 求出下面一段代码的时间复杂度,表示给定整数n的操作次数: 所以我认为外循环是,第一个内环是,第二个内环是。我只是想知道我是否有一个大致的想法,以及如何从这里继续前进。

  • 对于以下伪代码,我想先计算出作为输入大小函数的操作数,然后再将其放入大O表示法中: 到目前为止,我认为对于外循环的每个迭代,,内循环等于操作。顺从的 简化为O(n^2)。 但是我不确定我是否在正确的轨道上,因为我没有看到任何像这样的问题,即外循环的索引被用于内循环。