優れた特殊なケースのソートアルゴリズムとは何ですか?


13

2次元グリッドに配置された多数のオブジェクトであるデータセットがあります。厳密な順序で、各行で左から右に行くにつれて増加し、各列で上から下に増加することを知っています。例えば、

  • 1 2 3
  • 4 6 7
  • 5 8 9

単純な並べ替えを改善して、データセット全体を線形に並べ替えることができますか(比較で測定)。

ndデータセットについてはどうですか?比較のサブセットが既知の任意の有限データセット?


1
より正確な質問をお願いできますか?最初の段落を読んで、データが既にソートされていることを示唆できます!あなたの入力は正確に何で、どの出力が欲しいですか?
ジャックカレット

1
はい、言語は少しわかりにくいです。データセットが並べ替えられるn個の数字で構成されていることを理解するのに時間がかかりましたが、これらの数字は各行と各列が既に並べ替えられるようにsqrt(n)x sqrt(n)グリッドに配置されています。それはあなたが意図したものですか?

はい、それは私が意味したものです。わかりやすくするために編集します。
ザカリーヴァンス

回答:


19

この問題のΩ(n 2 log n)下限を比較するのは簡単です(比較ソートモデル):位置(i、j)の要素が常にi + jの距離1/2内にある場合、グリッド対角線は互いに独立しており、各グリッドの対角線内のソート順は任意です。したがって、この制約の下では、可能な順序の総数は、対角線の長さの階乗の積(グリッドのすべての対角線上の)であり、n 2 log nで指数関数的です。

つまり、標準の比較ソートアルゴリズムは、説明した順序で並べられたグリッドに対して漸近的に最適であるということです。


もう1つの答えは、この複雑さを備えた明示的なアルゴリズムを提供するため、この問題は2次元グリッドで、実際にはチェックせずに、おそらく任意の次元グリッドで解決されると考えます。
ザカリーヴァンス

4

問題を正しく理解している場合(そうでない場合はお気軽に教えてください)、2Dグリッドをソート済みの1D配列に変換したいのですが、各行と列はすでに2Dグリッドでソートされていますか?

この場合、リストの最初の要素は左上隅である必要があります(問題の定義により(0,0))。この後、他のすべての要素は定義によりこれらよりも大きくなるため、(1,0)または(0,1)要素のいずれかでなければなりません。

グリッド内の次の最小要素は、すでに使用されている要素(またはグリッドの端)のすぐ下、および既に使用されている要素(またはグリッドの端)の右に常にあると言うことで一般化できます。それよりも小さいと定義されています。したがって、各反復では、この要件を満たす最小値のみを考慮する必要があります。

可能性のある候補は、見つかった順にソートされた状態に保ち(1回の反復で2つまでしか使用できません)、各反復で使用可能な新しい値(存在する場合)を確認できます。前の候補の最下位よりも低い場合は、すぐにリストに追加して繰り返します。それ以外の場合は、前の最下位の候補を追加して、次の最下位と比較します。

残念ながら、これの正確な複雑さを提供できると主張したり、可能な限り最も効率的だと主張したりすることはありません。単純なアプローチよりも確かに優れているように思えます。

編集:このようなndグリッドの場合、同じ基本原理が適用されると思いますが、各反復で利用可能な新しい候補はn個になり、これらの候補はこの時点でn次元のそれぞれで最小の未使用要素でなければなりません。


つまり、mergesortのようにsqrt(N)-wayマージを実行できますか?それは私の実行中の最良の方法でしたが、O(N log N)であることが判明しました。正確な定数はありませんが、少なくともlog(sqrt(N))には0.5があります。
ザカリーヴァンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.