【发布时间】:2014-01-12 15:32:55
【问题描述】:
考虑Merge Sort 在包含n 元素的int Array 上的情况,我们需要一个额外的大小为n 的数组来执行合并。不过我们最终丢弃了额外的数组。所以归并排序的空间复杂度为O(n)。
但是,如果您查看递归 mergeSort 过程,则在每次递归调用 mergeSort(something) 时都会将一个堆栈帧添加到堆栈中。它确实需要一些空间,对吗?
public static void mergeSort(int[] a,int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
mergeSort(a,low,mid);
mergeSort(a,mid+1,high);
merge(a,mid,low,high);
}
}
我的问题是:
- 为什么我们不考虑堆栈帧的大小,而 计算合并排序复杂度?
- 是不是因为栈只包含了几个整数变量和 一个参考,不会占用太多内存?
- 如果我的递归函数创建了一个新的本地数组怎么办(比如说
int a[]=new int [n];)。那么在计算空间复杂度时会考虑它吗?
【问题讨论】:
-
2.是1的正确答案。至于3,是。
-
请注意,数组不会在 Java 中的堆栈上。只有对数组的引用。
-
真的!在 JAVA 中只会有一个关于堆栈的引用。在空间复杂度中是否应该考虑该参考的大小?
-
参考大小为O(1);对于归并排序,堆栈帧数 = 递归深度是对数的 O(log n)。仅当您设法使
merge在空间中成为 O(1)(即就地合并)时,这才重要。那么是的,而不是 O(1) 算法,你将有 O(log n) 算法,空间方面。 -
@WillNess 你是对的,但正如答案中所指定的,所有堆栈帧不会同时存在于堆栈中。它们在程序执行过程中不断减少和增加。
标签: java arrays algorithm recursion space-complexity