標準のマージソートの実装は、あまり多くのメモリを再割り当てしないという点で巧妙です(最初に半分に分割しても新しいメモリは割り当てられません)。consesの入力リストが与えられると、最悪の場合(本質的に同一の最良の場合)にリストconsesn
が割り当てられます。n * log(n)
要素自体の値が入力リスト、中間リスト、および出力リスト間で共有されることを考えると、リストconsによって3ワードのみを割り当てます。つまり、ソートは3 * n * log(n)
合計でメモリ内のワードを割り当てます(の場合n = 100 billion
、3 * log(n)
は110
、かなりです。巨大な一定の要因)。
一方、ガベージコレクションは、そのメモリの一部を収集できます。最悪の場合のメモリ使用量は、割り当てられたメモリの合計ではなく、ライブメモリの合計です。実際、再帰サブコールのレイヤー中に作成された中間リストはlog(n)
、結果が返される前に収集できるため(最終的merge
に新しいセルが割り当てられるのと同じ速度で死んでしまいます)、このアルゴリズムn
は最悪の場合、追加のライブconsセルを保持します。3*n
単語または24*n
バイトのみを意味します。の場合n = 100 billion
、これは、最初に入力リストのスパインを格納するために必要な量と同じ、2.4テラバイトの追加メモリを意味します。
最後に、入力リスト自体への参照を保持しない場合は、ソートされるとすぐに前半を収集して、のn/2
代わりに最悪の場合の境界を与えることができますn
。また、前半を並べ替えるときに、この前半の前半を収集して、のn/4
代わりに最悪の場合の境界を指定できますn/2
。この推論で限界に達すると、十分なGC作業があれば、実際にはリストを完全に適切に並べ替えることができると思います-stop&copy第1世代GCの一定サイズのメモリプールを法として、そのサイズはの時間パフォーマンスに影響を与えますアルゴリズム。