【问题标题】:What is the time complexity of this doubly-nested loop? [duplicate]这个双重嵌套循环的时间复杂度是多少? [复制]
【发布时间】:2017-04-19 19:40:31
【问题描述】:

嗨,我对跟随 sn-p 的时间复杂度有点困惑, 如果有人能阐明这一点,那就太好了。

     for ( i = 1; i <= n ; i ++)
        for ( j= i+1; j <= n; j++)
          //print something

【问题讨论】:

  • 复杂度为 O(N^2)
  • N + (N-1) + (N-2) +...+1 = ?

标签: c algorithm time-complexity big-o


【解决方案1】:

在这种情况下,请记住这一点:

如有疑问,请由内而外!

让我们来看看你的代码:

 for ( i = 1; i <= n ; i ++)
    for ( j= i+1; j <= n; j++)
      //print something

这里,打印东西的成本是 Θ(1)(假设你总是打印同样的东西),所以我们可以这样重写这段代码:

 for ( i = 1; i <= n ; i ++)
    for ( j= i+1; j <= n; j++)
       do Θ(1) work

现在,让我们由内而外地工作。那个内循环要做什么?好吧,当 i = 1 时,它将运行 n - 1 次迭代。当 i = 2 时,它将运行 n - 2 次迭代。当 i = 3 时,它将运行 n - 3 次迭代。从这个意义上说,所做的工作是 Θ(n - i),所以我们可以用这样的东西替换内部循环:

 for ( i = 1; i <= n ; i ++)
    do Θ(n - i) work

现在,让我们看看这个外部循环。第一次,这将做(大致)n - 1 个工作,第二次它会做 n - 2 个工作,第三次它会做 n - 3 个工作,等等。换句话说,总这里完成的工作(大致)等于

(n - 1) + (n - 2) + (n - 3) + ... + 3 + 2 + 1

这是一个著名的和,叫做Gauss's sum,它的值是n(n - 1) / 2,也就是Θ(n2)。因此,正如@Lashane 在他们的评论中指出的那样,这里完成的总工作是 Θ(n2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2015-06-17
    • 1970-01-01
    • 2015-12-21
    • 2021-03-04
    相关资源
    最近更新 更多