【问题标题】:Computational complexity of for loops-Contradicting with myselffor 循环的计算复杂度 - 与我自己矛盾
【发布时间】:2013-02-26 10:02:32
【问题描述】:

我通过分析一个程序的运行时间有一个矛盾。例如,考虑以下代码:

for(int i=0;i<n;i++)
{
    for(int j=0;j<n;j++)
    {
         .....
    }
}

这里,第一个for循环的计算复杂度是O(n2),第二个循环的计算复杂度是O(n)。但是,第二个循环执行 n2 次,而第一个循环执行 n 次。例如,如果我们在内循环中放置一个 cout 语句,它会输出 n2 次,但是如果我们在第一个循环内但在内循环之外的某个位置放置一个 cout,它会输出 n 次。那么为什么我们说内循环的复杂度是O(n),而外循环的复杂度是O(n2)。我们说外循环的复杂度是O(n2) 但它执行 n 次,为什么会这样?我做错了什么吗?谢谢。

【问题讨论】:

  • 第一个循环怎么会运行n^2次?
  • @Vallabh Patade 这就是我矛盾的地方。我们说外循环的复杂度是 O(n^2) 但它执行 n 次
  • 我们说代码sn-p的复杂度是n^2。

标签: algorithm complexity-theory big-o asymptotic-complexity


【解决方案1】:

内部循环执行 n 次,耗时 O(n)。外循环执行内循环 n 次,但您必须为这 n 次外循环执行中的每一个计算内循环的成本。这使得它 O(n * O(n)) = O(n^2)。

【讨论】:

  • 我知道,但是例如,如果我们在内循环中放置一个 cout 语句,它会输出 n^2 次,但是如果我们在第一个循环内但在内循环之外的某个位置放置一个 cout,它输出n次。那为什么我们说内循环的复杂度是O(n),而外循环的复杂度是O(n^2)
  • @YasinRazlık:因为计算复杂度不是“循环运行多少次”,而是“例程中的语句执行了多少次”(大致)。在您的情况下,在执行外循环时,内循环中的语句(例如j++)运行 O(n^2) 次,因此很复杂。
【解决方案2】:

外循环将运行 n 次,内循环将运行 n 次,外循环的每个迭代使内循环运行 n^2 次。因此,内部循环中的语句将被执行 n^2 次。

【讨论】:

  • 是的,它的内循环运行 n^2 次,时间复杂度为 O(n^2)。不是外面的
【解决方案3】:

假设 n = 7 ;那么

for(int i=0 ; i< 7 ; i++) //time complexity is : (1) + (7+1) + (7)
{
    for(int j=0;j<7;j++) //  time complexity is: (1) + [(7+1)+(7+1)+(7+1)+(7+1)+(7+1)+(7+1)+(7+1)] + (7)
    {
         .....
    }
}

总时间复杂度 = [2+2(7)] + [1 + (7+1)^2 + 7]

现在替换 7 = n ;我们会得到

总时间复杂度 = [2+2n] + [1 + (n+1)^2 + n] = 2 + 2n + 1 + (n^2 + 2n + 1) + n = n^2 + 5n + 4

这里的主导项是 n^2。所以最坏的情况将是 O(n^2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多