Big O - Don不了解这些算法的时间复杂度吗?

时间:2017-02-22 01:31:01

标签: java algorithm time complexity-theory

我正在学习如何在学校做时间复杂,教授上传了一些例子。对于下面的第一个例子,答案应该是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)。当我尝试它时,我得到:第一个用于循环运行n ^ 3次,内部用于循环n ^ 3 * n ^ 3 = n ^ 6,并且在else语句中的for循环我得到n,我的最终答案是O(n ^ 10)。有人可以给我一些关于上述问题的提示吗?到目前为止,我对此问题感到无能为力。到目前为止,我一直在解决其他问题。

1 个答案:

答案 0 :(得分:1)

计算BigO时的一个基本假设是放弃非主导术语

使用第一个例子,

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

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

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