基数ソートの実用的なアプリケーション
-
16-10-2019 - |
質問
RADIXのソートは、キーが特定の限られた範囲にあることを知っている場合、理論的に非常に高速です。たとえば、$ n $ $ n $の値[0 dots n^k -1] $などです。 $ k < lg n $の場合、値をベース$ n $に変換する場合、$ theta(n)$ timeを取得します。ベース$ n $ radixソートを実行し、$ 全体で元のベースに戻します。 theta(nk)$ algorithm。
しかし、私はそれを読みました 実際には、基数のソートは通常、ランダム化されたクイックソートなどよりもはるかに遅くなります:
大きな配列の場合、RADIXソートの命令カウントは最も低くなりますが、キャッシュパフォーマンスが比較的低いため、全体的なパフォーマンスはMergESORTとクイックソートのメモリ最適化バージョンよりも悪化しています。
Radixのソートは、優れた理論的アルゴリズムですか、それとも一般的な実用的な用途がありますか?
解決
基数のソートは、実際には、並列マシンで最も速く最も有用なソートです。
- Zagha and Blelloch:ベクターマルチプロセッサ用の基数ソート。 スーパーコンピューティング, 1991: 712-721.
- Blelloch、Leiserson、Maggs、Plaxton、Smith、およびZagha:接続マシンCM-2のソートアルゴリズムの比較。 Symp平行アルゴリズムとアーチ (SPAA-3):3-16、1991。
- Arpaci-Dusseau、Arpaci-Dusseau、Culler、Hellerstein、およびPatterson:ワークステーションのネットワーク上の高性能ソート。 データのMGTに関するconf, 、(Sigmod-1997):243-254。
- Arpaci-Dusseau、Arpaci-Dusseau、Culler、Hellerstein、およびPatterson。ソートレコードの検索:今すぐチューニングの経験。 ACM Sigmetrics Symp Parallelおよび分散ツール, 、(SPDT-2):124-133、1998。
マルチプロセッサの各ノードでは、おそらくクイックソートのようなことをしますが、RADIXソートにより、複数のノードがさまざまな再帰ソートよりも少ない同期で連携することができます。
他の状況もあります。必要な場合 安定したソート (2つのキーが等しいときはいつでも、再配置するのではなく同じ順序にとどまる種類)、私は使用するクイックソートのバージョンを知りません。 Mergesortも安定しています(正しく実装されている場合)。あなたのリンクは、MergesortがRadixソートよりも優れたキャッシュ動作をすることができると誰もが言うのを聞いたのを初めて聞いたことがあります。
他のヒント
@robert:あなたのリンクは非常に驚くべきことです(実際には引用された文が見つかりませんでした)。私の個人的な経験はランダム入力のためです、RADIXソートはSTLよりもはるかに高速です std::sort()
, 、クイックソートのバリアントを使用します。私は交換することでアルゴリズムを50%高速にするために使用していました std::sort()
不安定な基数のソートがあります。 QuickSortの「メモリ最適化バージョン」とは何かがわかりませんが、STLバージョンの2倍の速さであるとは思いません。
このブログ投稿 評価された基数は、他のいくつかのソートアルゴリズムとともにソートします。簡単に言えば、この評価では、 std::sort()
5,000万秒の整数を並べ替えるには5.1秒かかりますが、インプレース/不安定な基数のソートには2.0秒かかります。安定した基数のソートはさらに高速になるはずです。
RADIX SORTは、安定して並べ替える文字列にも広く使用されています。基数の種類のバリエーションは、接尾辞アレイ、BWTなどを構築するために時々見られます。
RADIXソートは、固定アルファベットの上に固定長の単語を並べ替える自然な方法でもあります。たとえば、Kärkkäinen&Sandersアルゴリズムなどhttp://www.cs.cmu.edu/~guyb/realworld/paperss04/kasa03.pdf)