配列のマージソートは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;
}
説明は素晴らしいでしょう。
Mergesortは再帰的なアルゴリズムです。再帰的なステップごとに、別のフレームがスタックに置かれます。 64アイテムの並べ替えは、32アイテムよりも再帰的なステップが1つ多くなります。実際には、スペース要件がO(log(n))と呼ばれるときに参照されるスタックのサイズです。
マージソートアルゴリズムは再帰的であるため、配列とリンクリストの両方のケースでO(log n)スタックスペースが必要です。しかし、配列の場合は、追加のO(n)スペースも割り当てます。これは、スタックに必要なO(log n)スペースを支配します。したがって、配列バージョンはO(n)であり、リンクされたリストのバージョンはO(log n)です。