【问题标题】:Time Complexity of Triple Nest Loop?三重嵌套循环的时间复杂度?
【发布时间】:2013-01-17 07:35:06
【问题描述】:
for(i=0; i<n; i++)
{
    a[i]=0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            a=3;
        }
    }
}

这是一个三重嵌套循环。我的书指出运行时间是: O(N) + O(N^2) = O(N^2)

不应该是 O(N^3) 吗?所有 3 个循环都相互依赖。它将运行 N*N*N 次。

【问题讨论】:

  • 这不是 n^3,因为变量 i 在内部循环中被重用,使其成为 n^2。
  • 不确定他们从哪里得到 O(n)。
  • 不,不是。最外层循环和第二个循环都使用 i。当第二个循环完成运行时,(O(n^2)),最外面的循环将退出。除非,当然,这是一个错字......
  • @G.Bach - 您应该将其作为答案提交。你值得称赞。
  • 我相信不应该有最外面的大括号。因此,您有一个用零填充 a[] 的循环,后跟是一个双循环。

标签: c for-loop time-complexity nested-loops


【解决方案1】:

这是因为循环#1和循环#2在比较时使用了相同的计数变量i

在使用i 的第二个循环结束时,i 的值是 n,这也使它脱离了外部循环。 一个循环在那里完全是多余的。


#include <stdio.h>
int main(){
    int x = 0;
    int n = 20;
    int i, j;
    for(i=0; i<n; i++) //this loop runs once
    {
        for(i=0; i<n; i++) //this loop runs n times
        {
            for(j=0; j<n; j++) //this loop also runs n times
            {
                x++;
            }
        }
    }
    printf("%d", x);
}

整个运行在O(N^2)时间。

Example

【讨论】:

  • 我不得不说,一个好的编译器会在O(n)/O(1)中制作这个例子,它可能会优化代码并将所有垃圾分层。
【解决方案2】:

我不认为它们是你书中的错误。您必须更深入地查看您的代码: 前两个循环使用相同的变量进行循环,所以会发生以下情况:

在第一个括号之后,i 等于 0,然后进入第二个循环。当第二个循环结束时,第一个循环将结束,因为两个循环都使用条件 i

其实我看不出 O(N) 是从哪里来的,但是全局复杂度应该是 O(N^2)

【讨论】:

    【解决方案3】:

    这不是 n^3,因为变量 i 在内部循环中被重用,使其成为 n^2。不知道这本书在哪里得到了 O(n)。

    【讨论】:

    • 我现在明白了。谢谢。我可以将 2 个外部循环视为一个。
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多