5

我的计算机科学 II 期末考试是明天,我需要一些帮助来了解如何为代码段找到 Big-Oh。我在互联网上搜索过,但找不到任何我需要如何理解它的例子。

这是我们最终样本中的一个问题:

for(int pass = 1; i <= n; pass++)
{
    for(int index = 0; index < n; index++) 
        for(int count = 1; count < n; count++) 
        {
            //O(1) things here.
        }
    }
}

我们应该找到算法的顺序(Big-Oh)。

认为这将是 O(n^3),这就是我得出这个结论的方式

for(int pass = 1; i <= n; pass++) // Evaluates n times
{
    for(int index = 0; index < n; index++) // Evaluates n * (n+1) times
        for(int count = 1; count < n; count++) // Evaluates n * n * (n) times
        {
            //O(1) things here. 
        }
    }
}
// T(n) = (n) + (n^2 + n) + n^3
// T(n) = n^3 + n^2 + 2n
// T(n) <= c*f(x)
// n^3 + n^2 + 2n <= c * (n^3)
// O(n) = n^3

我只是不确定我是否做得正确。有人可以解释如何评估这样的代码和/或确认我的答案吗?

4

2 回答 2

2

是的,它是O(n^3)。然而:

for(int pass = 1; pass <= n; pass++) // Evaluates n times
{                 //^^i should be pass

    for(int index = 0; index < n; index++) //Evaluates n times
       for(int count = 1; count < n; count++)  // Evaluates n-1 times
       {
            //O(1) things here. 
       }
    }
}

由于您有三层嵌套 for 循环,因此嵌套循环将被评估n *n * (n-1)次数,最内层 for 循环内的每个操作都需要 O(1) 时间,因此您总共有n^3 - n^2恒定的操作,这是O(n^3)按增长顺序排列的。

关于如何用大 O 表示法测量增长顺序的一个很好的总结可以在这里找到:

大 O 符号 MIT

引用上述文件的部分内容:

嵌套循环

 for I in 1 .. N loop
    for J in 1 .. M loop
      sequence of statements
    end loop;
 end loop;

外循环执行 N 次。每次外循环执行,内循环执行M次。结果,内循环中的语句总共执行了 N * M 次。因此,复杂度为 O(N * M)。在内循环的停止条件是J <Ninstead of J <M(即内循环也执行N次)的常见特殊情况下,两个循环的总复杂度为O(N^2)。

类似的理由可以适用于您的情况。

于 2013-05-05T22:30:54.773 回答
0

你是绝对正确的。对于您的示例,它是 O(n^3) 。

要找到任何代码段的 Big Oh 运行时间,您应该考虑这段代码执行 O(1) 次操作的次数。

让我简化您的示例以更好地了解这一点:

for(int index = 0; index < n; index++) // Evaluates n * (n+1) times
    for(int count = 1; count < n; count++) // Evaluates n * n * (n) times
    {
        //O(1) things here. 
    }
}

在上述情况下,每次运行外循环,内循环都会运行 n 次。你的外循环也运行 n 次。这意味着你正在做 n 件事, n 次。使它成为 O(n^2)。

另一件需要注意的事情是 Big Oh 是一个上限。这意味着您应该始终考虑当您有大量输入时代码会发生什么(在您的情况下, 的值很大n。这个事实的另一个含义是乘以或添加常量对 Big Oh 没有影响绑定。例如:

for(int index = 0; index < n; index++) // Evaluates n * (n+1) times
    for(int count = 1; count < 2*n; count++) // Runs 2*n times
    {
        //O(1) things here. 
    }
}

此代码的 Big Oh 运行时间也是 O(n^2),因为 O(n*(2n)) = O(n^2)。

还要检查一下:http ://ellard.org/dan/www/Q-97/HTML/root/node7.html

于 2013-05-05T22:40:26.310 回答