【问题标题】:What is the Big O notation for the following snippet of code?以下代码片段的大 O 表示法是什么?
【发布时间】:2022-09-13 00:01:19
【问题描述】:

下面的代码是一个遍历 for 循环的 java 方法,每次也创建一个新数组。我相信没有新数组实例化的代码是 O(N) 但有新数组声明,我不确定。

int[] reverseArray(int[] a) {
  int[] result = new int[a.length];
  for (int i = 0; i < a.length; i++) {
    result[a.length - 1 - i] = a[i];
  }
  int[][] 2DArray = new int[a.length][a.length/2];
  // do something with 2DArray
  return result;
}
  • 你所显示的只是O(a.length)
  • @TheCornInspector 这个问题没有具体说明它的作用,我不知道整个 sn-p 的 Big O 表示法是什么。
  • \"用 2D Array 做一些事情\"用 2D Array 做什么?到目前为止,您的代码是 O(n),我不知道您为什么觉得下半部分不相关
  • @TheCornInspector 那么 2DArray 如何影响代码的大 O 表示法。
  • @ksuk333 您之前没有指定您是在谈论时间复杂度还是空间复杂度。对于空间复杂度不,你对数组做什么并不重要。

标签: java arrays big-o


【解决方案1】:

您的 reverseArray() 方法忽略了未显示的“使用 2DArray 执行操作”部分,在空间复杂度和时间复杂度上都是 O(N)。它遍历输入数组一次,然后将其向后复制到输出数组中。

【讨论】:

  • 问题是要求空间复杂性*抱歉我忘了提。
  • 然后,您还需要显示“做某事”代码。除此之外,您只有O(N) 空间复杂度,这是分配新的反向数组所需的空间。
  • 没有指定做某事的代码,因为这是给我的所有问题。
  • 正如您已经指出的那样,二维数组的声明是O(N^2) in storage。如果未进一步分配任何内容,则未显示的代码从存储的角度来看是不相关的。
【解决方案2】:

实例化result 数组是O(n),循环是O(n),但实例化二维数组将是O(n^2),因为它将占用内存中的a.length * a.length / 2 ints,因此整体运行时间为O(n^2)

【讨论】:

  • 如图所示创建二维数组不是O(n^2)。我们没有显示二维数组的元素是如何初始化的,如果有的话。
  • 空间复杂度和运行时复杂度是完全分开的
  • 问题是要求空间复杂性*抱歉我忘了提。 –
  • @h0r53 2d 数组的内存归零,这需要 O(n^2)。这不是 C 语言,您可以在其中拥有未初始化的内存。
  • @h0r53 你不正确。在你初始化它的那一刻,内存已经被分配了。因此,问题上下文中的答案是正确的。
最近更新 更多