線形時間で整数を「ほぼソート」する


16

私は、線形時間で正の整数値配列をソートすることに興味があります(均一なコスト尺度を持つRAMモデル、つまり、整数は対数サイズまで持つことができますが、それらの算術演算は単位時間)。もちろん、これは比較ベースのソートアルゴリズムでは不可能であるため、「近似」ソートの計算、つまり、順列計算に興味がありますは本当に一般的にソートされていないが、のソートバージョンの「良い近似」。続編の記述が少し楽になるので、整数を降順でソートしていると仮定しますが、もちろん問題を逆に表現することもできます。L=v1,,vnvσ(1),,vσ(n)LL

近似ソートの1つの可能な基準は次のとおりです(*):をとし、ごとに、(つまり、 「準ソート済み」リストは、上から減少関数によって制限されます。実際のソートがこれを満たしていることは簡単にわかりますは以下でなければならないため、最大ではであり、一般には以下でなければなりませんであるNivi1invσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/iN/i

たとえば、要件(*)は、以下のアルゴリズムによって実現できます(@Louisが推奨)。私の質問は次のとおりです。実際のソートが満たす(*)などの要件を課すことにより、線形時間で整数を「ほぼソート」するこのタスクに関する既存の作業はありますか?以下のアルゴリズム、またはそのバリアントには、確立された名前がありますか?

編集:アルゴリズムを修正し、説明を追加しました


アルゴリズム:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

このアルゴリズムは、次の理由で意図したとおりに機能します。

  1. 要素の場合はバケットにあるJその後、V≤N / JvjvN/j

    vはバケットj=min(N/v,n)に入れられるため、jN/vN/v

  2. 要素がバケット場合、またはいずれかです。 vjN/(j+1)<vj=n

    vはバケットに入れられるため、またはます。最初の場合、、したがってを意味します。j=min(N/v,n)j=N/vj=nj=N/vjN/v<j+1N/(j+1)<v

  3. 用、あり、せいぜい、バケット内の要素は1〜。j<njj

    ましょうおよびletバケット1..jの一つの要素の総数です。2.により、バケット()のすべての要素は、ます。したがって、バケット内のからまでのすべての要素の合計は、よりも大きくなります。この合計また、以下でより従って、したがって 私たちに与える又は。j<nkV I I J N /J + 1 N /I + 1 < V K 1 jはK × N /J + 1 K N K × N /J + 1 < K NのK /J + 1 <viijN/(j+1)N/(i+1)<vK1jk×N/(J+1)KNk×N/(j+1)<KNk/(j+1)<1k<j+1kj

  4. TJ T T [ J ] N / Jは(*)を満たします。つまり、番目の要素は、jTT[j]N/j

    3.我々はそれを持っている、番目の要素、バケツから来てとため、。T[j]jTiijT[j]N/iN/j

  5. このアルゴリズムには線形時間がかかります。

    の計算には線形時間がかかります。バケットは、挿入と反復を持つリンクリストで実装できます。ネストされたループは、要素の数だけ実行されます(つまり、回)。NO(1)n


1
質問を却下しないでください(+1、それは良い質問です)が、基数ソートはあなたが必要とする以上のことをしないでしょうか?
Mehrdad

@Mehrdad:コメントありがとうございます!基数ソートは整数をソートしますが、時間がかかり。O(nlog(maxivi))
a3nm

その時間の複雑さについて、望ましくないことについて正確にコメントしてください。たとえば、1つの非常に大きな整数があり、他のすべては小さいですか?
Mehrdad

1
@ a3nm基数ソートはO(n log n)ではなくO(n)であるため、整数のサイズが固定されている場合は線形です(たとえば、32ビット数または64ビット数)。並べ替える数値のサイズは可変ですか?
ザビエルコンベル

1
@XavierCombelle:はい、RAMモデルで作業しています。入力整数が定数で区切られているとは思いません。
a3nm

回答:


8

これは、ASortアルゴリズムによく似ています。Giesen et。によるこの記事を参照してください。他:

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

残念ながら、実行時間は完全に線形ではありません。上記物品は、任意の比較に基づくランダム化アルゴリズムがランキングことを証明している内の項目をの下限有する(仮定)。nn2/ν(n)nlog(ν(n))ν(n)<n


質問の説明に応じて、編集

あなたがやっているのは単にバケットソートです。ただし、この場合、バケットソートのアルゴリズムは線形ではありません。問題:自然数を合計してから、それらのそれぞれで除算を実行する必要があります。数値のサイズには制限がないため、はもはや一定時間の操作ではありません。あなたが合計する必要があるより多くの数字を実行するのに時間がかかります。N/V[i]

どれくらい?除算は桁数に依存するため、に除算演算を掛けたものです。それはおそらくおなじみのように聞こえます。:)lg(n)n


1
この記事を教えてくれてありがとう!実際、それは質問に少し関係しています。ただし、私のアルゴリズム(元のバージョンでもわずかに異なる改訂版でもない)は、ASortとそれほど似ていません。まず、アルゴリズムはASortのような超線形時間ではなくで実行されると考えています。第二に、基準(*)はスピアマンのフットルール距離の近似とはかなり異なります。たとえば、フットルールの距離とは異なり、整数の値に応じて基準(*)は多少厳密になります。第三に、アルゴリズムとASortはどちらもバケット要素ですが、基準はかなり異なります。O(n)
-a3nm

@ a3nm上記の投稿の明確化は、バケットの並べ替えを使用していることを示唆しています。これは線形です(比較ベースではなく、2つのアイテムを相互にテストすることを意味します)。問題は、すべての数学的な整数に対して機能しないことです。整数サイズが制限されている場合にのみ機能します。
トリクシーウルフ

「整数サイズが制限されている場合にのみ機能する」と言うとき、これは実際に整数をソートしている場合にのみ当てはまると思います。しかし、一般に、私が投稿したアルゴリズムは実際にはそれらをソートせず、より弱い基準(*)を強制するだけです。したがって、整数サイズが制限されていない場合でも、線形時間で実行されると思います。
a3nm

2
@ a3nm線形ではありません。上記の拡張された応答を参照してください。
トリクシーウルフ

答えてくれてありがとう、そして遅れてすみません。私はモデルについていくらか混乱があると思います。私は均一な時間測定を備えたRAMモデルで作業しています(van Emde Boas、機械モデルとシミュレーション、ハンドブックの計算など):操作する数値は対数サイズになる可能性がありますが、これらの数値の算術演算には単位コストがあります。それに応じて質問を編集しました。このモデルでは、提案するアルゴリズムは実際に線形時間で実行されます(ただし、このモデルでは、実際の比較ベースの並べ替えの下限が適用されます)。nlogn
a3nm

2

結局のところ、私の質問は結局まったく無関係です。確かに、私は均一なコスト測定でRAMマシンに取り組んでいます(つまり、レジスタは必ずしも一定のサイズではないが、最大で入力に対数サイズの整数を格納できるレジスタがあり、これらのレジスタの操作には一定の時間がかかります少なくとも追加)。実際、このモデルでは、整数のソート(基本的に基数ソートを実行すること)は線形時間で実行できます。これは1996年の論文で、Grandjean、Sorting、linear time and the satisfiability problemで説明されています

(これは、整数セットの「ほぼソート」というよく研究された概念があるかどうかという私の質問には答えませんが、興味深いのは、これらのより弱い概念を実施するのがより簡単である必要があることです。モデルまたは何らかの形で準線形時間で実行されますが、現在のところ、これが当てはまるという意味を認識していません。)

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