web-dev-qa-db-ja.com

線形時間でソートしますか?

[0..n ^ 3-1]の範囲のn個の整数の入力セットが与えられた場合、線形時間ソートアルゴリズムを提供します。

これは木曜日の私のテストのレビューであり、私はこの問題にどのように取り組むかわかりません。

23
Stefan Kendall

関連する並べ替えも見てみましょう: pigeonhole sort または counting sort 、およびPukkuによって言及された radix sort

24
Ray Hidayat

基数ソート を見てください。

23
Reunanen

人々が「ソートアルゴリズム」と言うとき、彼らはしばしば「比較ソートアルゴリズム」を指しています。これは、「これはそれよりも大きいか、小さいか」を尋ねることにのみ依存するアルゴリズムです。したがって、データに関するこの1つの質問に限定する場合、n * log(n)を超えることはありません(これは、データセットのn個の階乗可能な順序のlog(n)検索を実行した結果です)。 。

「比較ソート」の制約を回避し、「このデータの基数10の基数は何か」など、データの一部についてより高度な質問をすることができる場合は、任意の数の線形時間ソートアルゴリズムを考え出すことができます。彼らはより多くのメモリを必要とします。

これは時空間トレードオフです。比較ソートはRAMをほとんどまたはまったく使用せず、N * log(n)時間で実行されます。基数ソート(たとえば)は、O(n)時間AND O(log(radix))メモリで実行されます。

9
Arthur Ulfeldt

N = 2で数値が一意であれば、それは本当に簡単です。

  • ビットの配列を作成します(2 ^ 31-1ビット=>〜256MB)。それらをゼロに初期化します。
  • 入力を読み取り、表示される値ごとに、配列の対応するビットを1に設定します。
  • アレイをスキャンし、ビットセットごとに、それぞれの値を出力します。

複雑さ=> O(2n)

それ以外の場合は、基数ソートを使用します。

複雑さ=> O(kn)(うまくいけば)

3
Ash

wikipedia は、さまざまな並べ替えアルゴリズムとその複雑さを示しています。あなたはそれらをチェックしたいかもしれません

3
ent

限られた範囲の数値のセットは、RANGEビットのビットマップで表すことができます。この場合、500 mbのビットマップなので、巨大なリスト以外の場合は、Radix Sortを使用することをお勧めします。数kに遭遇したら、bitmap [k] = 1に設定します。リストO(N)を1回走査します。

2
Sanjaya R

数字は、各数字の範囲が0〜n-1の3桁の数字と考えてください。これらの数値を基数ソートでソートします。各桁ごとに、シータ(n + n)時間を使用するカウントソートの呼び出しがあるため、合計実行時間はシータ(n)に対応します。

2
Dogukan