【问题标题】:I'm right about the time complexity on these situations?我对这些情况的时间复杂度是正确的吗?
【发布时间】:2021-12-16 05:47:17
【问题描述】:

在分析这样的代码的时间复杂度时,我对我的假设的正确性有点怀疑。在这段代码中,array.length() 被视为线性复杂度函数。最后一个细节很重要,最初的练习认为它只是一个常量存储值,但我想知道如果不是会发生什么):

void printPairs(int[] array) {
   for (int i = 0; i < array.length(), i++) {
       for (int j = 0; j < array.length(), j++){
          print(array[i], array[j])
       }
   }
}

所以,如果 array.length 是数组中的一个变量,就像在 java 中一样,那么这一切都只是 O(N^2)。但是如果 array.length() 是一个函数呢?他的实现应该是线性的……然后……起初我认为它应该变成 O(N^4) 的代码,但现在想得更好,我认为只是 O(N^3)。但我也认为这可能是我对这两个假设都错了,它一直是 O(N^2)。

有人可以纠正我吗?谢谢!

【问题讨论】:

  • Ehm,我的理由是,分解了 array.length() 函数的代码会变成这样的“for”结构:for ... for ... (first .length()) for ... for ... ((second .length())) 这就是为什么我坚持认为,看到 3 个级别的标识,它是 O(N^3)。我的推理中到底有什么不好的部分?
  • 对于整数数组,没有类似“strlen”的机制,长度被存储。

标签: arrays algorithm time-complexity pseudocode


【解决方案1】:

j &lt; array.length() 被称为array.length()*array.length() 次。

如果array.length() 是 O(1),那么 O(N^2)。 (例如 C++)

如果array.length() 是 O(N),那么 O(N^3)。 (例如 C strlen() 尽管代码可能会将其优化回 O(1))

【讨论】:

  • 谢谢!我对未优化的情况很感兴趣,因为我只是强迫我脑海中的情况,试图纯粹从理论上的角度理解这种情况会发生什么。所以它是O(N ^ 3)然后。你在第一行的推理方式也帮助我更好地思考这个问题,因为我正在以一种更直观的嵌套方式来思考它。
【解决方案2】:

编译器可能会做一个简单的优化:

void printPairs(int[] array) {
   int n = array.length();
   for (int i = 0; i < n, i++) {
       for (int j = 0; j < n, j++){
          print(array[i], array[j])
       }
   }
}

那就是 O(N^2)

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2021-08-25
    • 2018-04-09
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多