为什么mergesort空间复杂度O(log(n))与链表?

时间:2014-06-11 19:39:59

标签: arrays algorithm sorting linked-list

数组上的Mergesort的空间复杂度为O(n),而链表上的mergesort的空间复杂度为O(log(n)),记录为here

我相信我了解数组的情况,因为在合并两个子数组时我们需要辅助存储。但是,链接列表合并排序是不是只合并了两个子链接列表?我认为这会产生空间复杂度O(1)来创建一个新头。

就地合并(无辅助存储):

public Node merge(Node a, Node b) {
    Node dummyHead, curr; dummyHead = new Node(); curr = dummyHead;
    while(a !=null && b!= null) {
        if(a.info <= b.info) { curr.next = a; a = a.next; }
        else { curr.next = b; b = b.next; }
        curr = curr.next;
    }
    curr.next = (a == null) ? b : a;
    return dummyHead.next;
}

解释会很棒。

2 个答案:

答案 0 :(得分:25)

mergesort算法是递归的,因此对于数组和链表大小写,它需要O(log n)堆栈空间。但是数组的情况下还分配了一个额外的O(n)空间,它占据了堆栈所需的O(log n)空间。所以数组版本是O(n),链表版本是O(log n)。

答案 1 :(得分:20)

Mergesort是一种递归算法。每个递归步骤都会在堆栈上放置另一个帧。对64个项目进行排序将比32个项目多一个递归步骤,实际上当空间要求被称为O(log(n))时,它会引用堆栈的大小。