【问题标题】:What is time complexity of for loop of multiple conditions多个条件的for循环的时间复杂度是多少
【发布时间】:2021-07-18 17:48:30
【问题描述】:

我试图开发一种解决方案,以将 O(n^2) 或 O(n*m) 算法的时间复杂度降低到 O(n) 或 O(n+m) 算法。例如:

    let arr = [[1, 2], [1, 2, 3], [1, 2, 3, 4, 5, 6, 7, 8]];
    let x = 0;
    let len = getArrayMaxLength (arr) //Get the maximum length of a 2d array which in this example is 8.
    for (let i = 0; i < len && x < arr.length; ++i) {
        print (arr [x][(i % arr [x].length);
        if ((i + 1) % arr [x].length == 0) {
          ++x;
          if (x != arr.length) i = -1;
        }
    }

我在确定这个算法的 Big-O 时遇到了问题,因为我从来没有处理过这么多条件的循环。我读过thisthis,但还是不太对劲。据我了解,时间复杂度将是 O(n+m)。其中 n 是 [arr.length],m 是 [len],它是上述函数 getArrayMaxLength 的输出。

所以总结一下。算法的时间复杂度是多少? 谢谢。

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    如果您的循环体包含大量条件,但这些条件都不会增加外部 for 循环的重复次数,并且它们也不会根据某些输入进行任何具有可变时间的计算,则它们您应该将 body 视为一个常数,因此不会影响最终的 big-O 复杂度。

    你对 O(m + n) 的假设是正确的。

    【讨论】:

      【解决方案2】:

      请注意,每次 for 循环到达内部数组的末尾时,计数器(变量 i)都会重置,并且您增加 x,传递到下一个内部数组。这意味着您将遍历二维数组的每一个元素,程序输出证实了这一点。

      虽然n+m 的复杂性看起来不错,但实际上是一个糟糕的近似值。在实践中,复杂性总是更大,因为数组长度不同。假设所有子数组的长度相同,所以n = m。当您访问 n 个内部数组中的每一个的 n 个元素时,总复杂度将是二次的 (n*n) 而不是线性的。当您使用大型数组时,这种差异会变得非常明显。

      总之,时间复杂度为O(n*m)

      【讨论】:

      • 我理解你的观点。所以问题似乎在于重置变量 i。所以理论上如果我没有重置 i 并且我删除了增加变量 y 的条件,那么我认为它可能是 O(n)。我将尝试解决这些问题的另一种解决方案。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多