算法大o阶增长代码

Algorithmic big o order of growth code

我正在上在线课程,但我被这个问题困住了。我知道有类似的问题,但他们对我没有帮助。

What is the order of growth of the worst case running time of the following code fragment as a function of N?

int sum = 0;
for (int i = 0; i*i*i < N; i++)
    for (int j = 0; j*j*j < N; j++)
        for (int k = 0; k*k*k < N; k++)
            sum++;

我认为顺序应该是 n^3,但我认为这是不正确的,因为循环每次只经过 n 的三分之一。那会使它变成 nlogn 吗?

还有

int sum = 0;
for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++)
        for (int k = 1; k <= N; k = k*2)
            for (int h = 1; h <= k; h++)
                sum++;

我想这个应该是 n^4 因为你有 n * n * 0.5n * 0.5n

实际上循环只达到 N 的立方根。(i^3 < n,等等)

这个长度的3个嵌套循环,给出O(N的立方根,立方)。这个 O(N)

值得注意的是,如果你是对的,他们每个人都去了 N 的三分之一,那么立方这仍然是 O(N^3/9),1/9 是常数,所以这是 O(n^3 )

如果您针对 N 的各种值检查 sum 的值,那么算法的时间复杂度是多少就很清楚了:

#include <iostream>

int main()
{
  for( int N=1 ; N<=100 ; ++N ) {
    int sum = 0;
    for (int i = 0; i*i*i < N; i++)
      for (int j = 0; j*j*j < N; j++)
        for (int k = 0; k*k*k < N; k++)
          sum++;
    std::cout << "For N=" << N << ", sum=" << sum << '\n';
  }
  return 0;
}

然后您可以更深入地得出自己的结论。