ソートアルゴリズムには推移性が必要ですか


14

非推移的比較でソートアルゴリズムを使用することは可能ですか?はいの場合、なぜコンパレーターをソートするための要件として推移性がリストされていますか?

バックグラウンド:

  • ソートアルゴリズムは、通常、コンパレータ関数C(x、y)に従ってリストの要素をソートします。

    Cバツy={1もし バツy0もし バツy+1もし バツy

    私が理解している限り、このコンパレータの要件は次のとおりです。

    • 再帰的: バツCバツバツ=0
    • 反対称: バツyCバツy=Cyバツ
    • 推移的: バツyzaCバツy=aCyz=aCバツz=a
    • C(x、y)はすべてのxとyに対して定義され、結果はxとyのみに依存します

    (これらの要件は、実装ごとに常に異なるようにリストされているため、それらがすべて正しいことを確信していません)

今、私は「寛容な」コンパレータ関数について疑問に思っています: \ begin {array} {ll} C(x、y)= \ begin {cases} -1&{\ text {if}} \ x \ lt y-1 \\ 0&{\ text {if }} \ | x-y | \ le 1 \\ +1&{\ text {if}} \ x \ gt y + 1 \\ \ end {cases} \ end {array}C X Y = { - 1 であれば、X < Y - 1 0 なら| x y | 1 + 1 であれば、X > Y + 1|バツy|1

Cバツy={1もし バツ<y10もし |バツy|1+1もし バツ>y+1

例:両方[ 1, 2, 3, 4, 5][1, 4, 3, 2, 5]は、寛容なコンパレータに従って昇順で正しくソートされますCバツy0リスト内でxがyの前に来る場合はC(x、y)\ le 0
[1, 4, 2, 3, 5]、C(4,2)= 1でないため、そうではありません

このトレラントコンパレータは、反射的で非対称的ですが、推移的ではありません。

すなわち、C(1,2)= 0、c(2,3)= 0ですが、C(1,3)= -1、推移性に違反します

しかし、このコンパレータとランダムリストを指定したときに「正しくソートされた」出力を生成できないソートアルゴリズムは考えられません。

したがって、この場合、推移性は必要ありませんか?そして、推移性の緩いバージョンが存在している仕事にソートするために必要では?

関連する質問:


[3、2、1]でこのコンパレータを使用すると、ピボットの「常に中間を選択する」を使用したクイックソートは失敗すると思います。
G.バッハ

2
ソートアルゴリズムで使用される非推移的なコンパレータが無限ループを引き起こす可能性があると思います。
カロリスJuodelė13年

1
ソートされたリスト(つまり、必要な出力)として何を検討しますか?通常の場合、2つの同等の条件があります、すべてのに対してです。 A Ijの I jをaa+1aajj
ユヴァルフィルマス

@ G.Bach配列にn回3回、1回2回、n回1回、中央の2回が最初のピボットとして使用されると、その後何が起きても、クイックソートは実際に完全に失敗すると思います。
gnasher729

回答:


11

あなたは尋ねました:ソートアルゴリズムを実行して、非推移的なコンパレーターにフィードすることはできますか?

答え:もちろんです。任意の入力で任意のアルゴリズムを実行できます。

ただし、「ガベージイン、ガベージアウト」というルールを知っています。非推移的なコンパレータでソートアルゴリズムを実行すると、ナンセンスな出力が得られる場合があります。特に、出力がコンパレータに従って「ソート」されるという保証はありません。そのため、非推移的なコンパレータを使用してソートアルゴリズムを実行することは、おそらく期待していた方法では役に立たない可能性があります。

反例として、コンパレータを使用して入力リスト 3、2、1]で挿入ソートを実行すると、リストは変更されませんが、結果の出力リストはソートされません(コンパレータに従って)。[321]


1
私の最初の考えは、リスト[3,2,1] 私のコンパレーターに従ってソートされた順序であるため、もちろんソートは変更せずに残すべきだということでした。しかし、ソートの間違った定義を使用していた可能性があります。私はちょうどその直接の隣人と各要素を比較し、それは、リストをソート考慮するためには弱すぎるA制限かもしれない
HugoRune

4
@HugoRuneまあ、それは興味深い点です。何をしてください、あなたはで意味ソート?ソートアルゴリズムが非推移的なコンパレーターで終了することを示すことができ、アルゴリズムが終了するたびに、ある条件が真であり、その条件がソートの対象となることを示すことができる場合...もちろん、そのアルゴリズムはリストをソートします毎回、sortednessの定義について。コンパレータが推移的でない場合、ソート済みリストのすべての要素のペアごとの比較を必要とするソート済みの定義を取ることは意味をなさない場合があります。
Patrick87

3
@HugoRune、「隣人だけが比較される」場合、おそらくカスタムソートが必要です。標準アルゴリズムは、冗長な比較を回避するために推移性を想定しています。または、非推移的な順序を推移的な順序に埋め込むことができます。それとも、トポロジーソートの線に沿って何かを探していますか?
フォンブランド14

しばらく前にこれに遭遇しましたが、バブルソートは隣接する要素のみを比較するため、実際にはうまく機能することがわかりました。
Mooingダック

4

一連の要素とバイナリ順序関係を考えると、要素を完全に順序付けるには推移性が必要です。実際、要素の半順序を定義するには推移性も必要です。 http://en.m.wikipedia.org/wiki/Total_order

推移性なしに要素を並べ替えるには、「並べ替えられた」とはどういう意味かという、より広範な定義が必要になります。首尾一貫しているのは難しいです。別の答えは、「特に、出力がコンパレータに従って「ソート」されるという保証はありません。」しかし、実際にはもっと強力なことを言うことができます。コンパレータに従って出力がソートされないことが保証されます。

a<bb<cc<a


1
私は、部分的な順序を使用した並べ替えについて質問していると解釈しました(物事が等しくないと言う比較は推移的ですが、アイテムを区別する比較はそうではありません)。半順序に基づいた並べ替えが役立つ場合もありますが、最悪の場合はN(N-1)/ 2個の比較が必要です。最悪の場合、N(N-1)/ 2未満の比較を行うソートアルゴリズムは、私の回答で説明した理由により、部分的に順序付けられたアイテムを正しくランク付けできません。
supercat 14

2

あなたが望むのは、識別可能なすべてのランキングが正しいようにアイテムを配置することですが、近いアイテムは「区別できない」と見なされるかもしれません。そのような比較で機能するソートアルゴリズムを設計することは可能ですが、何回の比較で物が見分けがつかないと報告できるかという制限がない限り、N(N-1)/ 2の比較が必要になることを避ける方法はありません。理由を理解するために、いくつかの数Nと、N(N-1)/ 2未満の比較を行う並べ替えアルゴリズムを選択してください。次に、リストL [0..N-1]を作成し、各要素L [I]をI / Nに設定し、コンパレーターを使用して「ソート」します(最小値は0、最大値は(N-1)/ Nになります) 、そのため、差は(N-1)/ Nであり、1未満です)。

比較できるアイテムのペアはN(N-1)/ 2個あり、ソートではそれほど多くの比較を行わなかったため、相互に直接比較されなかったアイテムのペアがいくつか存在する必要があります。これらのいずれかが最初に1で並べ替えられ、もう一方が-1 / Nに置き換えられ、すべてのアイテムが元の位置に戻され、並べ替え操作が繰り返されます。すべての単一の比較操作は、最初と同じようにゼロを生成するため、同じ比較が実行され、アイテムは同じシーケンスになります。リストを正しくソートするには、「-1」は「-1 / N」の後にソートする必要があります(複数の違いがあるため)が、ソートアルゴリズムはこれら2つのアイテムを直接比較しないため、それを知る方法がないでしょう。


0

n要素の配列に値n、n-1、n-2、...、2、1を入力します。次に、「ストレート挿入」アルゴリズムを使用して並べ替えを試みます。各要素は直前の要素と等しいと見なされ、移動されないことがわかります。「ソート」の結果は同じ配列です。

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