【问题标题】:Big O of nested loop that with varying iterations?具有不同迭代的嵌套循环的大 O?
【发布时间】:2017-07-26 01:26:56
【问题描述】:

我在确定迭代依赖于外部循环的两组代码示例的 Big O 运行时间时遇到了一些麻烦。我对 Big O 运行时间有基本的了解,并且可以计算出更简单代码示例的运行时间。我不太确定某些行是如何影响运行时间的。

我会考虑第一个 O(n^2)。不过,我不确定。

for(i = 1; i < n; i++){
 for(j = 1000/i; j > 0; j--){  <--Not sure if this is still O(n)
    arr[j]++; /* THIS LINE */
 }
}

我对这个有点迷茫。 O(n^3) 可能 O(n^2)?

for(i = 0; i < n; i++){
 for(j = i; j < n; j++){
    while( j<n ){
      arr[i] += arr[j]; /* THIS LINE */
      j++;
    }
 }
}

我找到了这篇文章并将其应用于第一个代码示例,但我仍然不确定第二个。 What is the Big-O of a nested loop, where number of iterations in the inner loop is determined by the current iteration of the outer loop?

【问题讨论】:

    标签: c runtime big-o


    【解决方案1】:

    关于第一个。这是不是 O(n^2)!!!为了简单易读,我们用伪代码的形式重写一下:

    for i in [1, 2, ... n]:                              # outer loop
        for j in [1, 2, ... 1000/i]:                     # inner loop
            do domething with time complexity O(1).      # constant-time operation
    

    现在,内循环内的恒定时间操作数(取决于外循环的参数i)可以表示为:

    现在,我们可以计算出总体上恒定时间操作的数量:

    这里,N(n) 是一个调和数(参见wikipedia),这些数有一个非常有趣的性质:

    CEuler–Mascheroni constant。因此,第一种算法的复杂度为:


    关于第二个。似乎代码包含错误,或者是一个技巧测试问题。代码解析为

    for (i = 1; i < n; i++)
        for(j = i; j < n; j++){
            arr[j]++;
            j++;
        }
    

    内循环采用

    运算,因此我们可以计算整体复杂度:

    【讨论】:

    • 这应该是公认的答案,因为它纠正了 OP 对问题 1 的错误答案。
    • @meowgoesthedog 同意
    【解决方案2】:

    对于第二个循环(您似乎仍然需要答案),您有一些误导性的代码,其中您有 3 个嵌套循环,因此乍一看,运行时为 O 是有道理的(n^3)。

    但是,这是不正确的。这是因为最里面的 while 循环修改了 j,与 for 循环修改的变量相同。这段代码其实等价于下面这段代码:

    for(i = 0; i < n; i++){
      for(j = i; j < n; j++){
        arr[i] += arr[j]; /* THIS LINE */
        j++;
      }
    }
    

    这是因为内部的 while 循环将运行,递增 j 直到 j == n,然后它会中断。此时,内部 for 循环将再次增加 j 并将其与 n 进行比较,它会发现 j >= n,然后退出。你应该已经熟悉这个案例了,并且认为它是 O(n^2)。

    请注意,第二段代码是不安全的(技术上),因为当您在 while 循环完成运行后再增加一次时,j 可能会溢出。这将导致 for 循环永远运行。但是,这只会在 n = int_max() 时发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多