【问题标题】:Space Complexity Analysis of Merge Sort (C++)归并排序的空间复杂度分析(C++)
【发布时间】:2017-01-04 18:09:17
【问题描述】:

由于在 C++ 中数组是通过引用传递的,归并排序(递归)的空间复杂度仍然保持 O(n) 吗?如果是,那为什么? (我认为由于数组的元素没有被复制,所以空间复杂度应该是恒定的,即 O(k)。)

【问题讨论】:

  • 你从哪里得知数组是通过引用传递的?
  • @NathanOliver 默认情况下,c++ 通过引用传递数组
  • 这不是真的。默认情况下,当将数组传递给函数时,会传递指向数组第一个元素的指针。要通过引用传递数组,您将拥有类似 void foo(int (&arr)[10])
  • 我理解你的意思,但事实仍然是没有分配额外的内存,所以我们可以说对于 c++ 合并排序的空间复杂度是恒定的吗?
  • 进行就地合并排序是可能的,但很复杂:stackoverflow.com/questions/2571049/…。但是,它与 C++ 数组传递无关。一般来说,在分析算法时,总是假设数据是“通过引用”传递的,而不是在 O(N) 中复制。

标签: c++ algorithm sorting c++14


【解决方案1】:

空间复杂度在数组参数调用方法上保持 O(n) 独立 - 它是(经典)合并排序实现所需的缓冲区大小。

所以你有相同大小的输入数组(通常也是输出数组)和缓冲区数组 - 这就是为什么额外空间是 O(n)

【讨论】:

  • link 在 C++ 代码中,合并函数中的缓冲区数组是 'int arr[]'。但是由于数据是通过引用传递的,所以除了指针“arr”本身之外,它不会占用任何额外的空间。那么空间复杂度O(n)如何
  • 您忘记了内部缓冲区数组:/* create temp arrays */ int L[n1], R[n2];
猜你喜欢
  • 2023-01-18
  • 2015-07-22
  • 2022-10-25
  • 1970-01-01
  • 2020-12-14
  • 2020-09-19
  • 2012-05-07
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多