【问题标题】:Time complexity for inner for loop内部for循环的时间复杂度
【发布时间】:2015-02-16 19:24:24
【问题描述】:

我对以下程序的时间复杂度有疑问。我知道为什么第一个 for 循环是 n + 2 但对于第二个 for 循环为什么是 (n+1)/2?

// 循环示例 // 这不是一个完全编码的程序,仅用于循环时间复杂度分析

for (int i=n; i>=0; i--) //n + 2
    for (int j=i; j<n; j++) // (n+2)(n+1)/2
        cout << i << “,” << j <<endl; //(n+1)(n)/2

【问题讨论】:

  • 您的代码被截断了,可能是在复制和粘贴过程中。您能否编辑问题以显示代码?
  • 你的内循环,分开来看,总是 O(n)。请注意,O(n) 中的 n与您的变量 n 相同,它只是任何变量编号的标准名称。
  • 等等...n+2 和 (n+1)/2 怎么样?我真的不知道如何回答这个问题。
  • 由于愚蠢的智能引号,您的代码将无法编译

标签: c++ for-loop time complexity-theory time-complexity


【解决方案1】:

for 循环的时间复杂度为 O(N^2)。

我刚刚在codereview.stackexchange.com 上回答了一个类似的问题。

这是一个说明循环时间复杂度的简单程序。

#include <iostream>
using namespace std;

int main()
{
   const int N = 10;

   int numTotalOps = 0;
   for (int i = 0; i < N; ++i)
   {
      size_t numOps = 0;
      for (int j=i; j < N; j++)
      {
         cout << i << "," << j << endl;
         ++numTotalOps;
         ++numOps;
      }
      cout << "\nNumber of operations for i = " << i << ": " << numOps << endl;
   }

   cout << "\nNumber of total operations: " << numTotalOps << endl;
   return 0;
}

输出:

0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9

Number of operations for i = 0: 10
1,1
1,2
1,3
1,4
1,5
1,6
1,7
1,8
1,9

Number of operations for i = 1: 9
2,2
2,3
2,4
2,5
2,6
2,7
2,8
2,9

Number of operations for i = 2: 8
3,3
3,4
3,5
3,6
3,7
3,8
3,9

Number of operations for i = 3: 7
4,4
4,5
4,6
4,7
4,8
4,9

Number of operations for i = 4: 6
5,5
5,6
5,7
5,8
5,9

Number of operations for i = 5: 5
6,6
6,7
6,8
6,9

Number of operations for i = 6: 4
7,7
7,8
7,9

Number of operations for i = 7: 3
8,8
8,9

Number of operations for i = 8: 2
9,9

Number of operations for i = 9: 1

Number of total operations: 55

【讨论】:

    【解决方案2】:

    内部循环运行n-i 次;即它在i==n 时运行0 次,然后在i == n-1 时运行1 次,以此类推,直到ni == 0 时运行;总共n*(n+1)/2 次。 (不是您的 cmets 中所述的 (n+1)*(n+2)/2)。

    由于内部循环被启动n+1 次(不是n+2,如您所说),因此可以说它运行的平均次是n/2。 p>

    【讨论】:

      【解决方案3】:

      i 从 1 迭代到 N,并将 j 从 1 迭代到 i 的当前值(含),就像探索尺寸为 NN+1 的矩形的一半,对角分割.为了理解这一点,请在纸上为自己画出表格:行上为i,列上为j,并在嵌套循环访问的每个单元格中打勾。

      【讨论】:

      • 这是一个很好的类比。
      【解决方案4】:

      首先,您的第一个循环的时间复杂度为 O(n),嵌套循环正常的时间复杂度为 O(n^2),但内部循环针对 i 的每个值执行 i 次。外部循环执行 n 次,因此您会看到如下执行模式:1 + 2 + 3 + 4 + ... + n 次

      具体信息:

      1. O(1):函数(或语句集)的时间复杂度为 如果它不包含循环、递归和调用,则视为 O(1) 任何其他非常量时间函数。

      2. O(n):a 的时间复杂度 如果循环变量递增,则循环被视为 O(n) / 以恒定的量递减。例如以下函数 时间复杂度为 O(n)。

      3. O(n^c):嵌套循环的时间复杂度等于最内层语句的执行次数。

      来源->Link

      【讨论】:

      • 如果我有任何错误,请纠正我,如果您觉得我遗漏了什么,请发表评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2013-09-13
      相关资源
      最近更新 更多