ブラックボックスを使用した並べ替え


20

私たちは、リストの並べ替えしたいと仮定のの実数を。実数を即座にソートできるブラックボックスが与えられたと仮定します。このブラックボックスを使用してどれだけの利点を得ることができますか?Snn

たとえば、ブラックボックスへの呼び出しのみで数値を並べ替えることはできますか?私が見つけた最良のアルゴリズムは、ブラックボックスへの呼び出しを使用しています。しかし、私はそれをさらに改善することができませんでした。merge-sortに似たアルゴリズムを次に示します。O(n)n

最初にリストをリスト分割します。サイズは約です。次に、ブラックボックスへの呼び出しを使用して、これらのリストを並べ替えます。最後に、次のようにブラックボックスを使用して、ソートされたリストをマージします。Sns1,s2,...,snnn

リストの最小要素を新しいリストに入れ、ブラックボックスを呼び出してソートします。で数(第1の最小要素)で最小の数であろう。出力リストの最初の場所にそれを置くことができます。 要素を想定することから選択された我々は交換、ソートリストの二番目に小さい要素で、再度の二番目に小さい部材計算するためにその上にブラックボックスを実行。 すべての要素がソートされるまで続けます。この部分のブラックボックスコールの総数はLL[1]LS
sjL[1]sjS
nn。したがって、全体的な呼び出しの総数はます。n

一方、次のようにソートに必要な数の比較の下限を使用して下限を取得できるはずです:を使用してブラックボックスを実装できます比較。ブラックボックスへの呼び出しと線形時間のマージで問題を解決できる場合、比較で実数をソートできますが、これは不可能です。nlgn=12nlgno(n)no(nlgn)

ブラックボックスで使用する多くの比較が共有されるため、がブラックボックスへの呼び出し数の下限であることを証明できると思います。Ω(n)

更新:他の投稿が示唆しているように、も実現可能です。nlgn


2
コメントにタイプミスがあるようです。「未満のマシン呼び出しを使用するアルゴリズムは、未満の比較で実数をソートできません」と言うつもりでしたか?ps:また、下限は比較ベースのソートアルゴリズムにのみ当てはまるという事実にも注意する必要があります。 NNlgNNlgNNNNlgNNlgN
カヴェー

8
AKSのソートネットワークを使用してを取得することもできると思います。ネットワークは、ブラックボックスがサイズ2のブロックをソートできるモデルのインスタンス化と考えることができます。アルゴリズムはラウンドを使用し、各ラウンドは2ソーターを回呼び出します。 2ソーターの1つの「ラウンド」は、 -ソーターで簡単にシミュレートできます。OlognOnOnOO(nlogn)O(logn)O(n)O(n)O(n) n
ビナヤックパタク

6
@VinayakPathak:入力データをサイズチャンクに分割し、各コンパレーターをソーターに置き換えた後、AKSネットワークを使用してチャンクをソートします。2NN/2N
ジェフ

1
@Jɛff E:はい、素晴らしい、それは間違いなく私の構造よりも簡単に見えます。
ビナヤックパタック

1
@Jɛff E、あなたのコメントが答えになることがあります。:)
Kaveh

回答:


15

ブラックボックスへの呼び出しで並べ替えることができ、比較はできません。O(nlogn)

まず、以下の平衡分割問題を考える:所定の要素()、二つのグループ、少なくとも約サイズの最小にそれらパーティションので、最初のグループのすべての要素が2番目のグループのすべての要素よりも小さいこと。これは、ブラックボックスへの呼び出しで実行できます。(これについては後で説明します。)次に、このパーティションアルゴリズムでクイックソートを使用します。A [ 1 .. m ] mA[1..m]M/4OM/nmnm/4O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

各パーティションのステップを想定すると、かかるブラックボックスへの呼び出し、上記のアルゴリズムは、所与の入力、作るブラックボックスへの呼び出しを、再帰ツリーの深さはあり、ツリーの各レベルにはブラックボックスに対する合計呼び出しがあるためです。A[1 ..n]OO(m/n)A[1..n]OlognOn/O(nlogn)O(logn)O(n/n)=O(n)

次のようにパーティション化手順を実行します。

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

アルゴリズムpartition()の最後のステップ:「Xの周りのすべてのm個の要素をパーティション分割する」では、これはm個の追加の比較を使用しませんか?
ビナヤックパタク

2
アルゴリズムの直後の行を参照して、そのステップの実行方法を説明します。それをより明確にするために編集します。
ニールヤング

24

1990年からのBeigel and Gillの論文「k-sorterを使用したn個のオブジェクトのソート」で、あなたの質問は解決されたと思います。

k-ソーターは、単位時間でk個のオブジェクトをソートするデバイスです。k-ソーターを使用するアルゴリズムの複雑さは、k-ソーターのアプリケーションの数として定義されます。この方法では、n個のオブジェクトのソートの複雑さは、〜、nの1次項までです。およびk。 4nlognnlognklogk4nlognklogk


ありがとうございました。論文が見つかりませんでした。論文またはその証明へのリンクを提供できますか?
-AmeerJ


また、上のciteseerx
カヴェー

8
場合、ベイゲルとギルの境界はことに注意してください。 Θk=nΘ(n)
ジェフ

12

これは、ソートすることが可能であるobliviouslyとブラックボックスへの呼び出し、それぞれが元の入力の隣接サブアレイに適用されます。アルゴリズムは、ブラックボックスコールを介して入力データを変更することはありません。特に、同じブラックボックスコールのシーケンスは関数にすぎず、実際の入力データではありません(したがって "忘却")。nO(nlogn)n

これは、単なる代わりにサイズ部分配列をソートするブラックボックスを使用する、より単純なアルゴリズムのスケッチです。ブラックボックスへの呼び出しの総数は約です。表記を簡単にするために、は偶数で、は奇数の整数であると仮定します。k 2n/k2k2n/kn2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

およびのアルゴリズムの図を次に示します。データは左から右に移動します。各ボックスはソーターです。k = 4 kn=18k=4k

ここに画像の説明を入力してください

図が示唆するように、このアルゴリズムは入力配列をサイズのチャンクに分割し、比較交換操作の代わりにソーターを使用してチャンクにバブルソートを適用します。ネットワークが0と1の配列を正しくソートすることを観察することにより、正確さが続きますkk/2k

@VinayakPathakのコメントが示唆しているように、バウンドは、bubblesortを別のソートネットワークに置き換えることで削減できます。たとえば、Batcherの偶奇マージソートは、ブラックボックス呼び出しの数をに減らしネットワークソートAKSは、それを低減。この最後のアルゴリズムは、(大!!)定数因子までNealの非忘却アルゴリズムと一致します。O n / k log 2n / k = O O((n/k)2)On/klogn/k=OO((n/k)log2(n/k))=O(nlog2n)O((n/k)log(n/k))=O(nlogn)


ありがとう。Aすることができます下界を証明しますか?Ω(n lg(n))
AmeerJ

2
いいえ、ビーゲルとギルの論文は上限を暗示しています。O(n)
ジェフ

その素敵な写真のために+1!私は間違っているかもしれませんが、それは完全に正しいわけではないようです(間違っている場合は私を修正してください)。出力が昇順であると仮定すると、最小の要素が最後の位置にある場合、最初の位置に「移動する」ための「パス」はありません。「for i = 1 to m」を「for i = 1 to m + 1」に変更すると、これが修正されるようですが、不必要なオーバーヘッドが発生する可能性があります。
ジョージ

@ジョージおっと、あなたは正しい。もう1つのレイヤーが必要です!
ジェフス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.