web-dev-qa-db-ja.com

O(n)整数ソートアルゴリズムはありますか?

先週私はつまずいた この論文 著者が2ページ目に言及しているところ:

これにより、整数のEdgeウェイトの線形実行時間が得られることに注意してください。

3ページ目でも同じ:

これにより、整数エッジの重みの線形実行時間と、比較ベースの並べ替えのO(m log n)が得られます。

そして8ページ目:

特に、高速整数ソートを使用すると、おそらくGPAが大幅に高速化されます。

これは、整数値の特別な状況下でO(n)ソートアルゴリズムがあることを意味しますか?または、これはグラフ理論の専門ですか?

PS:
最初のページで彼らが言うのは、参考文献[3]が役立つ可能性があるからです。

[..]整数エッジ重み[3]、[...]などのグラフクラスのさらなる改善が達成されました。

しかし、私はどの科学雑誌にもアクセスできませんでした。

40
Karussell

はい、基数ソートとカウントソートはO(N)です。これらは比較ベースのソートではなく、Ω(N log N)下限を持つことが証明されています。

正確には、基数ソートはO(kN)です。ここで、kは、ソートされる値の桁数です。並べ替えのカウントはO(N + k)です。ここで、kは並べ替えられる数値の範囲です。

kが十分に小さく、基数ソートとカウントソートの両方が実際に線形時間のパフォーマンスを示す特定のアプリケーションがあります。

59

比較ソートは、平均で少なくともΩ(n log n)でなければなりません。

ただし、 counting sort および radix sort は入力サイズに比例してスケーリングします。これらは比較ソートではないため、入力の固定構造を活用します。

12
ephemient

カウントのソート: http://en.wikipedia.org/wiki/Counting_sort 整数がかなり小さい場合。数値が大きい場合は基数ソート(これは基本的にカウントソートの一般化、または必要に応じて数値が大きい場合の最適化です): http://en.wikipedia.org/wiki/Radix_sort

バケットソートもあります: http://en.wikipedia.org/wiki/Bucket_sort

5
IVlad

(主に大きなメモリオーバーヘッドのため)あまり実用的ではありませんが、別の興味深い線形時間ソートアルゴリズムとして Abacus(Bead)Sort に言及すると思いました。

2
Dolphin

これらのハードウェアベースの並べ替えアルゴリズム:

比較のないソートアルゴリズム
ハードウェアでの2進数のソート-新しいアルゴリズムとその実装

レーザードミノソートアルゴリズム -カウントソートのO(n)を超えるO(n + k)時間の複雑さを達成するためのカウントソートに基づく私による思考実験。

1
abcoep

もう少し詳細を追加する-実際には、日付までの最良のソートアルゴリズムはO(n)ではなく0(n\sqrt {\ log\log n})です。

このアルゴリズムの詳細については、ペーパーで確認できます。 http://dl.acm.org/citation.cfm?id=652131

0
akuriako