c++ - 带有 if 语句的嵌套 for 循环的时间复杂度

标签 c++ c big-o

此代码的 if 语句如何影响此代码的时间复杂度?

基于这个问题:Runtime analysis , if 语句中的 for 循环将运行 n*n 次。但在这段代码中,j 超过了 i,因此一旦运行第二个循环,j = i^2。那么这使得第三个 for 循环的时间复杂度是多少呢?我知道第一个 for 循环运行 n 次,第二个运行 n^2 次,第三个运行 n^2 次并触发一定次数。因此,复杂度将由 n*n^2(xn^2) 给出,其中 n 是 if 语句为真的次数。复杂性不仅仅是 O(n^6) 因为 if 语句不正确 n 次,对吗?

int n;
int sum;
for (int i = 1; i < n; i++)
{
  for (int j = 0; j < i*i; j++)
    {
      if (j % i == 0)
        {
          for (int k = 0; k < j; k++)
            {
              sum++;
            }           
        }       
    }   
}

最佳答案

ji 的倍数时,if 条件为真;当 j 从 0 到 i * i 时,这发生了 i 次,所以第三个 for 循环只运行 i 次。整体复杂度为 O(n^4)。

for (int i = 1; i < n; i++)
{
  for (int j = 0; j < i*i; j++)       // Runs O(n) times
    {
      if (j % i == 0)                 // Runs O(n) × O(n^2) = O(n^3) times
        {
          for (int k = 0; k < j; k++) // Runs O(n) × O(n) = O(n^2) times
            {
              sum++;                  // Runs O(n^2) × O(n^2) = O(n^4) times
            }
        }
    }
}

关于c++ - 带有 if 语句的嵌套 for 循环的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58294341/

相关文章:

c - 更新链接列表顶部条目

algorithm - 交集算法 O(n) 更好的方法?

c++ - 套接字缓冲区中烦人的 NUL block

c++ - 如何检查参数包中的每种类型是否唯一?

c++ - 用日期时间命名输出文件

Cmake - 想要查看中间 .i 文件

c - 递归连接两个整数

c++ - 使用 Qt 5.4 和 Clang(64 位)的 Mac 10.9 上的 Zipios 错误

sorting - 为什么我们在最佳和平均情况下也使用大 O 表示法?

performance - leader-follower算法的时间复杂度?