数値のペアをソートするアルゴリズム


14

私はすでにstackoverflowでこの質問をしましたが、おそらくこのサイトに適しているでしょう。

問題は:

N組の符号なし整数があります。それらをソートする必要があります。ペアの終了ベクトルは、各ペアの最初の数で非減少的に、各ペアの2番目で非増加的にソートする必要があります。各ペアでは、任意のポイントで第1要素と第2要素を交換できます。解決策がない場合があるので、例外をスローする必要があります。

例:

in pairs:
1 5
7 1
3 8
5 6

out pairs:
1 7     <-- swapped
1 5     
6 5     <-- swapped
8 3     <-- swapped

^^ペアを交換しないと、ソリューションを構築できません。そのため、ペア(7、1)、(3、8)、および(5、6)を交換し、結果を作成します。または

in pairs:
1 5
6 9

out:
not possible

ありがとう

編集:

SOのTom Sirgedasは最高のソリューションを提案しました。実装は非常に簡単で、O(log(n)* n)で動作します。回答と関心をお寄せいただきありがとうございます。mjqxxxxの分析は本当に楽しかったです。


6
興味深い問題。スワッピングなしでは簡単ですが、スワッピングでは、独自のソリューションが存在するかどうかは明確ではありません。
デイブクラーク

2
ユニークなソリューションが常に存在するとは限りません。すなわち(1、10)、(5、6)。(1、10)、(5、6)と(1、10)、(6、5)の両方が正しいです。
クラーク

4
次回リンクを含めてください。 stackoverflow.com/questions/5323941/...
剛伊藤

2
私の友人の一人は、紙のテストインタビューの質問としてそれを得ました。だから私はそれがちょうど好奇心からだと思う:)
クラーク

3
(1)クラーク、返信ありがとうございます。(2)この質問は研究レベルの質問だとは思わないが、変更すべき範囲だと思う。私はメタに関する議論を始めました。
伊藤剛

回答:


8

2つのペアおよびp 2 = a 2b 2は、どちらもスワップせずにソート済みリスト内のいずれかの順序で配置できる場合、非スワップ互換であるとします。いずれかの場合、これは真である12B 1B 2又は21件のB 2Bp1=a1b1p2=a2b2a1a2b1b2。そのノート P 1及び P 2があれば、無スワップ互換性があり、それらがある場合にのみ、二スワップ互換性(半順序が満足を定義するので、P 1P 2P * 2P * 1 *スワップ操作を示します) 。最後に、 p 1 p 2は、それらの1つだけがスワップされたソート済みリストでどちらの順序でも配置できる場合、1スワップ互換です。これは、 p 1およびa2a1b2b1p1p2p1p2p2p1p1p2p1は非スワップ互換です。残りの場合、 p 1 p 2は単純に互換性がありません。スワップ状態に関係なく順序条件を満たすことはできません。p2p1p2

この問題は次のように解決できます。ペアのすべてのペアをテストします。いずれかのペアに互換性がない場合、解決策はなく、例外をスローできます。そうでない場合は、元のペアに対応するノードと、1スワップ互換ではないノードのペア間のエッジを持つグラフを検討してください。そのようなノードの各ペアは、適切にソートされたリストで同じスワップ状態を持つ必要があります。したがって、グラフの各接続コンポーネントのすべてのノードは同じスワップ状態でなければなりません。これらのコンポーネント全体のスワップ状態を一貫して割り当てることができるかどうかを判断する必要があります。接続された各コンポーネント内のノードのすべてのペアをテストします。いずれかのペアが非スワップ互換でない場合、解決策はなく、例外をスローできます。接続されたコンポーネントのすべてのペアをテストします(つまり、コンポーネントC1及び、ノードのすべての対を試験P 1C 1及びP 2C 2)。コンポーネントの各ペアには少なくとも1つのスワップ互換性がありますが、一部のペアは非スワップ互換性もあります(エッジで接続されていないノードの各ペアには少なくとも1つのスワップ互換性があり、スワップ対応)。接続されたコンポーネントに対応するノードを持つ縮小グラフと、対応するコンポーネントがスワップ互換でない場合は、2つのノード間のエッジを検討します。このグラフが2色の場合のみ、元の問題の解決策があります。2がない場合C2p1C1p2C222-色付け、解決策はなく、例外をスローできます。ある場合は、単色のすべてのコンポーネントのすべてのノードを交換します。任意の2つのノードが非スワップ互換であることが保証されたため、定義された部分順序を使用してペアのリストを適切にソートできます。

アルゴリズムの各ステップ、したがってアルゴリズム全体は、時間で実行できます。ON2


更新:よりエレガントな構造は次のとおりです。ペアのペアが非スワップ互換でない場合は、対応するノードをエッジで接続します(2色で異なる色になるように強制します)。ペアのペアが1スワップ互換でない場合、対応するノードを長さ2のチェーンで接続します(2色で同じ色になるように強制します)。結果のグラフが2色である場合にのみ、解決策があります。グラフの青赤の色からソリューションを構築するには、対応するノードが青であるペアのみを交換し、結果のリストをソートします。


1
お返事ありがとうございます。私はそれを読んで本当に楽しかったです。SOで提案された答えを確認してください。グラフ理論に依存していないため、エレガントなソリューションよりも面白くありません:)、より高速です。お時間をいただきありがとうございます。
クラーク

3

X(a、b)は、ペア(a、b)を交換する必要があるかどうかを示すバイナリ変数を示します。いくつかの異なるペア(a、b)および(c、d)を検討し、2つのペアがそれぞれX(a、b)およびX(c、d)で示されるスワップを実行した後の正しい順序。このようなすべてのバイナリ制約の結合は、n個の変数とO(n ^ 2)句の2-SAT式であり、元の問題に解決策がある場合にのみ充足可能です。これは時間O(n ^ 2)で確認できます。


元のソリューションについては、すべての制約がX(a、b)= X(c、d)またはX(a、b)!= X(c、d)(またはX(a、 b)=定数)ので、単純な「二部性のマージとチェック」アルゴリズムが機能します。

各Xがそれ自身のみを含むセットの代表であるところから始めます 次に、X = Yが制約となるすべてのペア(X、Y)について、XとYが属するコンポーネントをマージします。最後に、各コンポーネントが1つの頂点であり、X!= Yの関係が成り立つ必要がある場合にXとYを含むコンポーネントを結合する縮小グラフが2部であることを確認します。


1
バツab=バツcd

そう?ここでの同値関係は、a <cおよびb> dまたはその逆の場合、関係(a、b)R(c、d)の推移的閉包です。私は完全に明示的ではなかったかもしれませんが、これは私の答えから明らかなはずです。
デビッド

1
a<cb>dバツabバツcd1102537

1
バツYバツ¬Y

1
冗談ですか?まず、任意のちょうど2つの変数の間の関係は、2-SATの式のように表すことができます。たとえば、X = Yは(XはYを意味します)および(XではないことはYを意味しません)と同じです。一方、すべての制約がX = YまたはX = Y以外の形式である場合、2SATアルゴリズムを実行する必要はまったくありません。以前に説明したより単純な「2部性のマージとチェック」アルゴリズムが動作します。
デヴィッド・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.