c - 这个双重嵌套循环的时间复杂度是多少?

标签 c algorithm time-complexity big-o

您好,我对以下代码片段的时间复杂度有点困惑, 如果有人能够阐明这一点,那就太好了。

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

最佳答案

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

When in doubt, work inside out!

让我们获取您的代码:

 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)。

关于c - 这个双重嵌套循环的时间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504709/

相关文章:

c : gdb : Overwriting and freeing too much memory

c - 在 C 中读取 .mat 文件

在网页中查找 'article' 的算法?

algorithm - 如何在有向图中找到彼此距离 k 的所有节点(探索图中的每条边)?

algorithm - 如何将一组唯一的数值转换为一组较短长度的唯一字母数值?

c - 如果 puts() 函数没有遇到空字符会怎样?

c - c中的指针和数组

c - 需要帮助找出该算法的复杂性

c++ - 如何存储稀疏矩阵?

javascript - 我的算法可以被认为是 O(n) 吗? "Finding the longest substring with unique characters"