web-dev-qa-db-ja.com

Mergesortスペースの複雑さO(log(n))がリンクリストであるのはなぜですか?

配列のマージソートはO(n)のスペースの複雑さを持っていますが、リンクされたリストのマージソートはO(log(n))のスペースの複雑さを持っています here に文書化されています

2つのサブアレイをマージするときに補助ストレージが必要になるため、アレイのケースは理解できたと思います。しかし、リンクリストのマージソートは、2つのサブリンクリストを適切にマージするだけではないのでしょうか。新しいヘッドを作成するには、スペースが複雑になると思います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;
}

説明は素晴らしいでしょう。

22
modulitos

Mergesortは再帰的なアルゴリズムです。再帰的なステップごとに、別のフレームがスタックに置かれます。 64アイテムの並べ替えは、32アイテムよりも再帰的なステップが1つ多くなります。実際には、スペース要件がO(log(n))と呼ばれるときに参照されるスタックのサイズです。

20
dcsohl

マージソートアルゴリズムは再帰的であるため、配列とリンクリストの両方のケースでO(log n)スタックスペースが必要です。しかし、配列の場合は、追加のO(n)スペースも割り当てます。これは、スタックに必要なO(log n)スペースを支配します。したがって、配列バージョンはO(n)であり、リンクされたリストのバージョンはO(log n)です。

25
Jim Lewis