【发布时间】:2013-04-29 16:15:23
【问题描述】:
明天是我的计算机科学 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
我只是不确定我是否做得正确。有人可以解释如何评估这样的代码和/或确认我的答案吗?
【问题讨论】:
-
您的答案是正确的,但您计算的每个循环的迭代次数却不是。第一个和第二个都迭代
n次,第三个迭代n - 1次。显然这不会影响结果。 -
如果你必须使用 O(n^3) 算法来解决现实世界的问题,情况就很糟糕了。
-
@john: 也取决于很多情况和
n的数量:-) -
@MM。这就是问题所在,当你的 O(n^3) 代码与 5 个小部件一起工作时,老板很高兴,然后他要求你在 10,000 上运行它。
-
需要在
for(int pass = 1; i <= n; pass++)中定义i。此外,pass未经过测试。如果 i