【问题标题】:O-notation with for-loop with modulo condition带模条件的 for 循环的 O 表示法
【发布时间】:2017-09-11 20:58:14
【问题描述】:

我的问题是如何计算此操作的 O 表示法,其中两个外部循环将执行 O(n^3) 次。我的问题是,当在条件中使用模数并且内部 for 循环仅在 i 是 j 中的一个因素时运行时,o 表示法将是什么。

for(int i = 1 ; i <= n ; i++) {
   for(int j =1; j <= i ∗ i ; j++) {
      if(j % i == 0 ) {
         for(int k = 0 ; k < j ; k++ ){
             sum++;
         }
       }
    }
}

【问题讨论】:

  • 仍然会被计算为 O(n^3)。
  • 为什么不将中间循环定义为for(int j = i; j &lt;= i * i; j += i) {?看起来不那么可怕并且更容易编译。
  • 或者只是让 j 的范围从 1 到 i,然后在需要值时乘以 i...
  • 考虑到内部循环是 O(n^2),我实际上希望它是 O(n^4)。
  • @Turing85:但你不能忽视这样一个事实,即 if 条件在每次迭代中都不为真。对于每个外部循环,这是真的 i 次。它测试了 O(n^3) 次(我假设每次检查的时间都是恒定的,所以如果整体结果比 O(n^3) 差,这无关紧要),但只通过 O(n^2) 次,所以内部循环只执行 O(n^2) 次,但本身是 O(n^2),导致整体 O(n^4)。至少,我是这么认为的……

标签: java big-o modulo


【解决方案1】:

O(n^4)

这个技巧是if (j % i == 0)。由于i 几乎是nj 的范围为n^2,我们知道这个陈述将是真的n + (n-1) + ... + 1 次将简化为(n+1)(n+2)/2O(n^2),这将反过来运行一个循环运行n^2 次。然后我们需要把它当作一个加法,所以我们有n^3 + n^2 * n^2,这简化为O(n^4)

如果我的推理有问题请指出,我有点生疏。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2020-03-16
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2014-08-30
    • 2022-11-26
    • 2021-11-17
    相关资源
    最近更新 更多