【问题标题】:Time Complexity for Modulus in Nested Loops嵌套循环中模的时间复杂度
【发布时间】:2021-05-24 18:13:36
【问题描述】:
sum=0;
for(i=1; i<n;i++)
   for( j = 1; j < i * i; j++ ) 
      if( j % i == 0 )
        for( k = 0; k < j; k++ ) 
             sum++;

我知道最外面的循环执行 n 次,下一个循环执行 n^2 次,但是我如何将 j%i 与循环分解?正确答案是 O(N^4),但我不确定如何达到。

【问题讨论】:

    标签: java for-loop big-o mod


    【解决方案1】:

    由于我们知道k 循环仅在j 可被i 整除时执行(这是取模的地方),我们可以计算出k 在每个i 循环的次数循环:

    • i = 2, j:1..4:循环 2 次 (j=2)。
    • i = 3, j:1..9:循环 3 + 6 次 (j=3,6)。
    • i = 4, j:1..16:循环 4 + 8 + 12 次 (j=4,8,12)。
    • ...
    • i = n, j:1..n*n:循环n + 2n + ... (n - 1) * n
      • Sum(k * n, k = 1, n - 1) = n^2 * (n - 1) / 2 次。

    我意识到这应该停止在i = n - 1,但这足以显示增长。

    这意味着我们的复杂性是

    2 + (3 + 6) + (4 + 8 + 12) + ... + (n^2 * (n - 1) / 2)
    =Sum(
      i^2 * (i - 1) / 2, 
      i = 2, n - 1
    )
    =Sum(
      (i^3 - i^2) / 2, 
      i = 2, n - 1
    )
    

    由于 i^3 占主导地位,除以 2 无关紧要,因此它的时间复杂度与

    Sum(i^3, i=2, n - 1)
    

    这是O(n^4)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2019-05-18
      • 1970-01-01
      相关资源
      最近更新 更多