この特定の実装について説明してみます。これは、おそらく最も単純なものの 1 つです。偶然ではありませんが、入力ドメインでも許容数の厳しい制限があります (値で表されますMAX
)。
10 個の数値のコレクションがあるとします。それらが共有する 1 つの属性は、それらがすべてドメイン [0..5] にあるということです。
{ 3, 2, 2, 5, 1, 4, 0, 2, 5, 4 }
次に、バケットの「リスト」を作成します。各バケットは、ドメインからの値のコレクションを表します。入力配列ではありません。私たちのドメインでは 6 つの可能な値が許可されているため、6 つのバケットを作成します (気付かない場合のために、これらは「順番に」あります)。
0: {}
1: {}
2: {}
3: {}
4: {}
5: {}
次に、入力リストをたどって、各値をバケットにドロップします。概念的には、完成すると次のようになります。
0: {0}
1: {1}
2: {2,2,2}
3: {3}
4: {4,4}
5: {5,5}
次に、バケットのリストを調べて、それぞれの内容を元のコンテナーにダンプし、そこにあった項目を置き換えます。
{ 0, 1, 2, 2, 2, 3, 4, 4, 5, 5}
簡単そうですよね?では、なぜ誰もがあらゆる種類のためにこれを行っていないのでしょうか? さて、問題を拡大して考えてみましょう。可能な値を 6にする代わりにMAX
、「値」を1048576
(ご参考までに 2 20 ) で境界付けますが、並べ替えられるアイテムの数を 10 に保ちます。
ここで、次のリストが与えられます。
{ 3, 2, 2, 1048576, 1, 4, 0, 2, 5, 4 }
「バケット」リストは次のようになります。
0: {0}
1: {1}
2: {2,2,2}
3: {3}
4: {4,4}
5: {5}
6: {}
7: {}
.....
1048575: {}
1048576: {1048576}
ええ、10 個の数字を並べ替えるのに 100 万を超えるバケットが必要です。これは、問題のドメインで許容される最大値であるためです。MAX
明らかに、これは大きな天井には適していません。入力範囲を管理可能なセットにサブ分割することは、これに対する実行可能な解決策になります (実際、基本的には基数ソートがどのように機能するかです。
最後の一連の質問に答えるために、入力ドメインがかなり小さい場合、ソート速度でこれを打ち負かすのは難しいでしょう. たとえば、1,000 個の数字のセットがあり、そのすべてが[0..9]
. それに数桁追加すると、まったく比較になりません。ただし、支払う価格、重い価格は、制限された入力ドメインです。ドメインのサイズが大きくなるにつれて、バケット分割アルゴリズムの観点からアプローチする必要があり、そうするにつれて、O(NlogN) への道を歩み始めます。それを考えると、考慮に値する独自の警告のセットを持つアルゴリズム (ヒープソート、マージソート、クイックソートなど)がたくさんあります。
明らかに「勝つ」場所: 100 万個の 8 ビット文字 (定義により の値[0..255]
) をソートする必要があるとします。それを行うためのより高速なアルゴリズムは見つかりません。ドメインは明確に定義されており、非常に管理しやすく、「バケット」の適切なテーブル (文字通りカウンターのテーブル) が利用されていれば、それに勝るものはありません。