web-dev-qa-db-ja.com

基数ソート:LSDバージョンとMSDバージョン

"Introduction to Algorithms" 基数ソートのLSD(最下位桁)バージョンについて言及しています。ただし、他の人がここでstackoverflowで指摘しているように、MSD(Most Significant Digit)バージョンも存在します。だから私はこれらのそれぞれの長所と短所を知りたいです。私の推測では、LSDバージョンにはMSDバージョンよりもいくつかの利点があると思いますが、よくわかりません。したがって、質問。

19
Geek

リンクから取得すると、役立つ場合があります: http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_sorting.aspx (一番下)

LSD基数ソートの最大の問題は、違いが最も少ない桁から始まることです。最上位桁から始めることができれば、最初のパスは範囲全体のソートに大いに役立ち、その後の各パスは単に詳細を処理します。 MSD基数ソートの考え方は、等しい値を持つすべての数字を独自のバケットに分割し、配列がソートされるまですべてのバケットで同じことを行うことです。当然、これは再帰的なアルゴリズムを示唆していますが、可変長のアイテムを並べ替えることができるようになり、並べ替えられた配列を取得するためにすべての桁に触れる必要がないことも意味します。これにより、MSD基数ソートが大幅に高速化され、より便利になります。

9
Roman Dzhabarov

固定長の場合、LSDはMSDよりも高速です。 MSDは小さなファイルには遅すぎ、小さなファイルに対しては膨大な数の再帰呼び出しが必要です。

4
M.J.Watson

本で読んでいるように Algorithms 、LSDとMSDは両方とも、比較ではなく、いわゆるキーインデックスカウントに基づく文字列配列ソートアルゴリズムです。したがって、LSDとMSDの実行時間は、従来のクイックソートまたはマージソートとは異なります。

Dzhabarovが述べたように、LSDとMSDの最大の違いは、MSDが最上位の数字または文字を最初に考慮することです。これは、文字列内のすべての数字を反復処理せずに、本質的に文字列を並べ替えます。これは利点です。ただし、MSDの再帰的実装は、LSDよりも多くのスペースを使用します。

以下の表は、クイックソート、LSD、MSDの違いの一部を示しています。

algorithm    running time              extra space
quicksort    N(lgN)^2                  1
LSD          NW                        N
MSD          between N and NW          N + WR

ここで、Nは配列の長さ、Wは文字列の長さ、Rは基数のサイズです。

PS:本で述べられているように、Javaシステムソートは、LSDやMSDではなく、高速の文字列比較を備えた一般的なソートアルゴリズムを使用します。

3
Mr. Pei