Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环三的大O表示法_Java_Big O_Time Complexity - Fatal编程技术网

Java 循环三的大O表示法

Java 循环三的大O表示法,java,big-o,time-complexity,Java,Big O,Time Complexity,以下代码的复杂性是什么?会是N^2*log(N)吗 for(int m=1;m=1;k--) { 对于(int i=1;i第一个循环执行n次。 第二个循环执行n/2次。 第三个循环执行k/2次,相当于n/4次 这会给您一个O(n^3)复杂度 实证检验: #include <iostream> using namespace std; int main () { int n = 1000; long first = 0, second = 0, third = 0

以下代码的复杂性是什么?会是N^2*log(N)吗

for(int m=1;m=1;k--)
{

对于(int i=1;i第一个循环执行n次。 第二个循环执行n/2次。 第三个循环执行k/2次,相当于n/4次

这会给您一个O(n^3)复杂度

实证检验:

#include <iostream>

using namespace std;

int main () {
    int n = 1000;

    long first = 0, second = 0, third = 0;

    for (int m = 1; m <= n; m++)
    {
        first++;
       for (int k = m; k >= 1; k--)
       {

          second++;
          for (int i = 1; i <= k; i++)
          {
              third++;
          }
        }
     }

    cout << first << " " << second << " " << third << endl;

    return 0;
}

如果循环体的运行时间为
O(C)
O(C*k)

第二个循环需要多长时间?
O(C*(1+2+3+…+m))=O(C*m²)

整个代码片段需要多长时间?
O(C*(1²+2²+3²+…+n²))=O(C*n³)


有关求和多项式的信息,请参见。

如果使用西格玛表示法,您可以得出以下结论:


为什么你认为这是
n^2log(n)
?@ralis-正确的方法是分析代码而不是猜测。(答案是“不是”).@Stephen C-你是什么意思?@StephenC除非你现在正在参加多项选择题考试。@ralis-你的老师没有教你如何从第一原理进行复杂性分析吗???我想你算错了第二和第三个循环的迭代次数。你是如何得到
O(C*(1²+2²+3²+…+n²))的
?实际迭代次数为
1+(1+2)+(1+2+3)+……(1+2+3+…+n)
——从1到n的总和(n*(n+1))/2.你是说前者是一个精确的计数,还是仅仅把它作为实际计数的一个松散的上限?@Andythonas:精确计数在这里是不相关的,因为O符号。我不是说它是一个精确的计数,但是幂低于2的一切都可以安全地忽略。(Faulhaber公式告诉您,次数
x
的多项式的任何和都会导致次数
x+1
#include <iostream>

using namespace std;

int main () {
    int n = 1000;

    long first = 0, second = 0, third = 0;

    for (int m = 1; m <= n; m++)
    {
        first++;
       for (int k = m; k >= 1; k--)
       {

          second++;
          for (int i = 1; i <= k; i++)
          {
              third++;
          }
        }
     }

    cout << first << " " << second << " " << third << endl;

    return 0;
}
1000 500500 167167000