基数ソートの実用化


20

キーが特定の制限された範囲にあることがわかっている場合、たとえば[ 0 n k1 ]の範囲の値など、基数ソートは理論的に非常に高速です。場合のk < LG のnあなただけのベースに値を変換するn個とるΘ n個の時間を、ベース行うn個のソート基数をして、全体のためにあなたの元のベースに戻って変換するΘ nはkのアルゴリズム。n[0nk1]k<lgnnΘnnΘnk

ただし、実際には基数ソートは通常、たとえばランダム化されたクイックソートを実行するよりもはるかに遅いことを読みました。

大規模な配列の場合、基数ソートの命令数は最も少なくなりますが、キャッシュパフォーマンスが比較的低いため、全体的なパフォーマンスは、マージソートおよびクイックソートのメモリ最適化バージョンよりも劣ります。

基数の並べ替えは素晴らしい理論上のアルゴリズムですか、それとも一般的な実用的な用途がありますか?

回答:


15

多くの場合、基数ソートは、実際には、並列マシン上で最速かつ最も有用なソートです。

マルチプロセッサの各ノードでは、おそらくクイックソートのようなことを行いますが、基数ソートでは、さまざまな再帰ソートよりも少ない同期で複数のノードを連携させることができます。

他の状況もあります。あなたが必要な場合は、安定ソートし、私が使用されるであろうクイックソートのいずれかのバージョンを認識していないよ(2つのキーがある時はいつでも、彼らが同じ順番にとどまるのではなく、再配置ばかり等しくソート)。Mergesortも安定しています(正しく実装されている場合)。あなたのリンクは、マージソートに基数ソートよりも優れたキャッシュ動作を持たせることができると言うのを聞いたのは初めてです。


パターソンとヘネシーは、本「コンピューター組織とデザイン」でラマルカがリンクした上記の論文と同じ点を指摘しています。
ロバートS.バーンズ

パターソンについてのあなたの言及は、アンドレア・アルパシ・デュソーが約15年前にクラスターの選別に行った重要な仕事を思い出させてくれました。(パターソンは共著者でした)。1997年の論文で、彼らは実際に、部分基数ソートが個々のノードでのクイックソートよりも望ましいと決定しました。(参照を回答に追加しました)。
さまようロジック

それは面白い。CompOrgの2009年の第4版では、以前のバージョンのRadixソートに関するLamarcaの作業がキャッシュフレンドリでないことを参照しています(pg。489)が、490ページでQuicksortとRadixソートを比較するグラフの下で、「このような結果のため、アルゴリズムの利点を取り戻すために、メモリ階層を考慮した基数ソートが考案されました。」Radix Sortのこれらの新しいバージョンがどのように動作するのか興味があります。
ロバートS.バーンズ

私の疑いは、Lamarcaがバカな基数ソート(バケットをリンクリストとして保持する基数ソート)を使用しただけだということです。誰もそれをしないでしょう。ある種の最適化された動的配列(C ++などvector)を使用してバケットを実装します。しかし、私は知らない。ラマルカの論文を読んだことがないからだ。
さまようロジック

@WanderingLogic基数ソートはどこでバケットを使用しますか?ここでバケットを並べ替えますか?
バー

3

@Robert:あなたのリンクは非常に驚くべきものです(実際、引用された文は見つかりませんでした)。私の個人的な経験はランダム入力であり、基数ソートはstd::sort()クイックソートのバリアントを使用するSTLよりもはるかに高速です。以前std::sort()は、不安定な基数ソートに置き換えることで、アルゴリズムを50%高速化していました。クイックソートの「メモリ最適化バージョン」とは何なのかわかりませんが、STLバージョンの2倍の速度になるとは思いません。

このブログ投稿では、基数ソートと他のいくつかのソートアルゴリズムを評価しました。簡単に言うと、この評価でstd::sort()は、5000万個の整数をソートするのに5.1秒かかりますが、インプレース/不安定な基数ソートには2.0秒かかります。安定した基数ソートはさらに高速になります。

基数ソートは、文字列を安定してソートするためにも広く使用されています。基数ソートのバリアントは、サフィックス配列、BWTなどを構築するために時々見られます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.