Sorting 合并排序空间

Sorting 合并排序空间,sorting,complexity-theory,space-complexity,Sorting,Complexity Theory,Space Complexity,在自顶向下的合并排序中,递归函数的调用方式如下: void mergesort(Item a[], int l, int r) { if (r <= l) return; int m = (r+l)/2; mergesort(a, l, m); mergesort(a, m+1, r); merge(a, l, m, r); } void合并排序(项目a[],整数l,整数r){ 如果(r你怎么在logn空间中存储n项呢?那没有意义。如果你对n项进行

在自顶向下的合并排序中,递归函数的调用方式如下:

void mergesort(Item a[], int l, int r) {
    if (r <= l) return;
    int m = (r+l)/2;
    mergesort(a, l, m);
    mergesort(a, m+1, r);
    merge(a, l, m, r);
}
void合并排序(项目a[],整数l,整数r){

如果(r你怎么在
logn
空间中存储
n
项呢?那没有意义。如果你对
n
项进行排序,
O(n)
空间是你能得到的最好的空间。

你是对的,递归调用占用的空间是O(logn)

但是数组本身占用的空间是O(n)

总空间复杂度为O(n)+O(logn)

这就是O(n),因为它的上边界是(n)=>2(n)

那么,尽管有适当的合并技术,但空间复杂度如何是O(n)呢

因为您的书中给出的实现可能没有使用就地合并技术。如果需要O(1)空间和O(n log n)时间排序,则通常首选heapsort合并排序,因为它更容易。只有当您谈论排序列表时,才需要执行O(1)合并排序是有意义的…然后,它很容易做到。例如,为链表指定的合并排序将是O(1)空间和O(n log n)时间


这里的基本误解似乎是:时间复杂性适用于算法,而不是它们所解决的问题。如果我愿意,我可以编写一个O(n^3)合并排序……但这并不意味着我的算法不是O(n^3),也不意味着它对你的O(n log n)没有任何影响合并排序。这与计算复杂性有点不同,在计算复杂性中,我们讨论的是P中的问题。如果有多项式时间算法,问题就在P中。然而,P中的问题也可以通过非多项式时间算法来解决,如果你想一想,构造这样的算法很简单。sp也是如此ace复杂性。

由于您没有在mergesort函数中分配除常量之外的任何空间,因此此函数的空间复杂性为O(lg(n))。但是,对于数组,您的合并过程将分配内存,因此请记住它将变为O(lg(n))+O(n)=O(n)。如果使用链表,则可以避免合并过程中的临时空格,从而达到O(lg(n)最好。

什么数组占用了空间?我看不到该函数中创建了任何数组。传递给mergesort的数组是通过引用传递的。函数不创建数组并不意味着数组不存在。数组已经存在,并且占用了O(n)空间。我们通常谈论整个过程的时间和空间复杂性,但是,是的,如果你想超级挑剔,那么函数不会向现有数组添加O(n)空间,它只会添加O(logn)对于堆栈帧数据。我同意@FrankQ。输入通常不被视为空间复杂性的一部分。这就是为什么冒泡排序被视为O(1)而不是O(n)空间。这不是就地合并。