【问题标题】:Finding the computational complexity of a nested loop查找嵌套循环的计算复杂度
【发布时间】:2013-09-25 07:03:57
【问题描述】:

我很难理解这个 for 循环的复杂性

for (i = 4; i < n; i++)
{
    for (j = i - 3, sum = a[i - 4]; j <= i; j++)
    {
        sum += a[j];
    }
    System.out.println("sum thru" + i + ": " + sum);
}

我在想这个嵌套循环的复杂度是 n^2,因为它是一个嵌套循环 但有人告诉我这是不正确的,嵌套循环并不总是二次复杂度!

我真的不知道如何以一种好的方式获得复杂性。我看过很多关于 Big-O 和复杂性的文章,但它们并没有帮助,因为它们希望我了解所有内容,而且它们的示例与我拥有的任何示例都不相同。

我不是在问答案,我是在问方法。是否有任何公式或方法适用于本主题中的所有内容?我想知道如何获得分配的数量,但不幸的是我不知道如何做到这一点。

谁能一步一步给我解释一下?

【问题讨论】:

  • 它不是二次的(相对于n),因为j 总是从i-3i。这意味着内部循环总是只有四次迭代,一个独立于n 的数字。
  • 另外,还有一个公式:wolframalpha.com/input/… - 每个算法的公式都不一样。

标签: java algorithm for-loop complexity-theory big-o


【解决方案1】:

您可以看到外部循环迭代 (n-4) 次,因为它从 4 开始并且条件小于 only。内部循环将最多迭代 4 次。因为它以 i-3 开头,以 i 结尾。所以复杂度是 4*(n-4)。因此复杂度为 O(n)。

【讨论】:

  • 感谢您的解释。我得到了内环部分,但我仍然不明白为什么外环是 n-4?它总是n-(i的数量)吗?
  • 是的。内循环(不是内循环内的块)将被执行 n-4 次,即外循环执行 n-4 次。
  • @rullzrullz :这是因为外循环从 4 开始,到 n 结束。所以 (n-4) 次
  • 非常感谢您澄清 Ragavan 和 Panther
【解决方案2】:

我认为没有任何公式可以解决有关算法时间复杂度的所有问题。对我来说,找出大 O 的最好方法是一步一步地,从外部过程到内部过程。我相信这也是像你我这样的初学者的标准方式。对于您的问题,首先,外循环是 O(n),这是直截了当的。然后在每个循环内部,我们有一个内部过程,这是另一个循环。该循环从 i-3 到 i,即 O(1)。然后在那个过程中,它是一个正常的赋值语句,又是 ​​O(1)。 我们综合考虑,大 O 将是 O(n) * O(1) * O(1) = O(n)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多