【问题标题】:Big O - Don't understand time complexity for these algorithms?Big O - 不了解这些算法的时间复杂度?
【发布时间】:2017-07-11 21:20:28
【问题描述】:

我正在学校学习如何计算时间复杂度,教授上传了一些示例。对于下面的第一个示例,答案应该是 O(n^3),但我不明白如何。

public static int fragment1 (int n)
{
    int sum = 0;
    for (int i = 1; i <= n*n; i++) 
       for (int j = 0; j*j < i; j++) sum++;
    return sum;
} // end fragment1

当我尝试这个问题时,我查看了第一个 for 循环,发现它运行了 n^2 次,然后内部 for 循环也是 n^2。加起来我得到 O(n^4)。

public static int fragment5 (int n) 
{
    int sum = 0;
    for(int i=0; i < n*n*n; i++)
    {
        if(i%(n*n) == 0) {
            for(int j=i*i; j > 0; j--)
                sum++;
        } // if
        else
        {
            for(int k=0; k < i: k++)
                sum++;
        } // else
    } // outer loop
}

对于上面的问题,答案应该是O(n^7)。当我尝试它时,我得到:首先 for 循环运行 n^3 次,内部 for 循环 n^3*n^3 = n^6,以及 else 语句中的 for 循环我得到 n,我的最终答案是 O(n ^10)。有人可以就上述问题给我一些提示吗?当涉及到这个问题时,我感到一无所知,到目前为止,我一直在解决其他问题。

【问题讨论】:

  • 对于第一个例子,n 和 j 是否有某种关联?该问题是否有其他信息?外循环运行 n^2 次,但内循环运行 j^2 次。除非 n == j,否则你不能说它们结合为 n^4。
  • 这些不是严肃的算法——这些只是教你复杂性的技巧,你需要自己学习。我确信有一位助教可以帮助你。提示例如 1,您说“那么内部 for 循环也是 n^2” - 错误。好好看看循环实际上说了什么。不是j &lt; i,而是j * j &lt; i
  • Q1 的更大提示:尝试将 x^(1/2) 从 x = 1 积分到 n^2 对于 Q2:最坏的情况是在 if 块,并尝试找出通过思考if 条件为真多少次,j 循环会发生多少次
  • 您可以通过运行具有各种 n 值的代码并将其与 sum 的最终值作图来验证您的答案。尝试 n = 10, 20, 30, 40

标签: java algorithm time complexity-theory


【解决方案1】:

计算 BigO 时的一个基本假设是删除非主导项

使用第一个例子,

  • 外循环的阶数为 O(n^2)
  • 内循环的阶数为 O(n^3)
    • 内部循环独立运行 'n' 次,但由于它是嵌套的,它将运行 'n * (n^2) '

因此,BigO 的形式为 O((n^2) + (n^3)),足以满足 O(n^3)。

您可以尝试对第二个问题使用相同的技术。
如果您仍然有一些困惑,请查看以下视频: Big O Notation

【讨论】:

  • 非常有帮助,非常感谢
猜你喜欢
  • 2021-04-30
  • 2023-03-27
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
相关资源
最近更新 更多