Sortierarray von 5 ganzen Zahlen mit maximal 7 Vergleichen


19

Wie kann ich eine Liste mit 5 ganzen Zahlen sortieren, sodass im schlimmsten Fall 7 Vergleiche erforderlich sind? Es ist mir egal, wie viele andere Operationen durchgeführt werden. Ich weiß nichts Besonderes über die ganzen Zahlen.

Ich habe ein paar verschiedene Divide-and-Conquer-Ansätze ausprobiert, mit denen ich auf 8 Vergleiche zurückgreifen kann, z. B. einen Mergesort-Ansatz verfolgen oder Mergesort mit der binären Suche kombinieren, um die Einfügeposition zu finden, aber jedes Mal, wenn ich 8 erhalte, wird der schlechteste Fall verglichen .

Im Moment suche ich nur einen Hinweis, keine Lösung.


Haben Sie versucht, den Vergleichsbaum zu schreiben? Es hat Blätter, die jeweils einer Permutation der ganzen Zahlen entsprechen. Wenn Sie nicht wissen, was ich mit dem "Vergleich mit" -Baum meine, wissen Sie, dass Sie Vergleiche benötigen ? Ps, warum denkst du, ist das möglich? n log n5!=120nlogn
Pål GD

1
Nun, im 8-Bit-Zweierkomplement if(x > y)ist das das gleiche, if((x - y) & 0x80)was kaum zu vergleichen ist. Ich denke, wir sollten vergessen, dass die Objekte ganze Zahlen sind und davon ausgehen, dass wir eine magische compare(x, y)Funktion verwenden müssen, um diese Objekte zu vergleichen ...
Karolis Juodelė

2
Gilt es als Hinweis oder Lösung , Abschnitt 5.3 über die optimale Sortierung in Band 3 von The Art Of Computer Programming zu lesen , in dem genau diese Frage behandelt wird? :-)
Steven Stadnicki

3
Die Grenze ist wirklich dasund . So ist es (im Prinzip) möglich. 5 ! = 120 < 2 7 = 1282cn!5!=120<27=128
Vonbrand

Antworten:


23

Es gibt nur einen Weg, um diesen Prozess zu starten (und für fast alle Ihre Entscheidungen, was in späteren Schritten verglichen werden soll, gibt es nur einen richtigen). Hier erfahren Sie, wie Sie es herausfinden. Beachten Sie zunächst, dass es mögliche Antworten für Ihre Vergleiche gibt, und 5 ! = 120 verschiedene Permutationen, zwischen denen Sie unterscheiden müssen.27=1285!=120

Der erste Vergleich ist einfach: Sie müssen zwei Schlüssel vergleichen, und da Sie nichts über sie wissen, sind alle Auswahlmöglichkeiten gleich gut. Nehmen wir also an, Sie vergleichen und b und stellen fest, dass a b ist . Sie haben jetzt noch 2 6 = 64 mögliche Antworten und 60 mögliche Permutationen (da wir die Hälfte davon eliminiert haben).abab26=6460

Als nächstes können wir entweder und d vergleichen , oder wir können c mit einem der Schlüssel vergleichen , die wir im ersten Vergleich verwendet haben. Wenn wir c und d vergleichen und feststellen , dass c d ist , haben wir 32 verbleibende Antworten und 30 mögliche Permutationen. Auf der anderen Seite, wenn wir vergleichen c mit ein , und wir entdecken , dass ein c , wir haben 40 mögliche Permutationen bleiben, weil wir beseitigt haben 1 / 3 der möglichen Permutationen (die mit c cdccdcd3230caac401/3 ). Wir haben nur noch 32 mögliche Antworten, also haben wir Pech.cab32

Jetzt wissen wir also, dass wir den ersten und den zweiten Schlüssel sowie den dritten und den vierten Schlüssel vergleichen müssen. Wir können annehmen, dass wir und c d haben . Wenn wir vergleichen e auf eine dieser vier Tasten, durch das gleiche Argument , das wir im vorherigen Schritt verwendet wird , könnten wir nur beseitigen 1 / 3 der Permutationen bleiben, und wir sind kein Glück. Also müssen wir zwei der Schlüssel a , b , c , d vergleichen . Unter Berücksichtigung der Symmetrie haben wir zwei Möglichkeiten: Vergleichen Sie a und c oder Vergleichen Sie a und dabcde1/3a,b,c,dacad. Ein ähnliches Zählargument zeigt, dass wir und c vergleichen müssen . Wir können ohne Einschränkung der Allgemeinheit annehmen, dass a c , und jetzt haben wir a b und a c d .acacabacd

Da Sie um einen Hinweis gebeten haben, werde ich den Rest des Arguments nicht durchgehen. Sie haben noch vier Vergleiche. Setze sie mit Bedacht ein.


Wie sind Sie zu dem Ergebnis gekommen, dass Sie durch den Vergleich von mit c nur noch 40 Permutationen haben? ac
Robert S. Barnes

1
@ Robert: Angenommen, Sie haben und a c . Dann gibt es zwei Permutationen von a , b , c, die mit diesen Einschränkungen übereinstimmen, a < b < c und a < c < b . Für jede dieser beiden Permutationen gibt es vier Stellen, an denen Sie d und fünf Stellen, an denen Sie e hinzufügen können, hinzufügen können . abaca,b,ca<b<ca<c<bde
Peter Shor

8

Sie finden dies in The Art of Computer Programming, Band III, von D. Knuth, aber die Strategie ist wie folgt (ich nehme an, Sie haben das Array ): Wenn Sie einen Hinweis lesen möchten Nur die ersten beiden Zeilen meiner Antwort{a,b,c,d,e}

  • Erste Gruppenpaare von Zahlen: .(a,b),(c,d)
  • Vergleichen Sie Paare, um sie zu sortieren, zB: .a<b,c<d
  • Vergleicht man kleinste Elemente von Paaren, so ergibt sich zB .a<c
  • Vergleiche das letzte Element mit dem größeren Element im letzten Vergleich ( c ) ec
    • Wenn , ist es leicht, mit 3 verbleibenden Vergleich zu enden. Fertig.e<c
    • Wenn dann solltest du { b , c , d , e } mit dem Wissen c < e , c < d sortieren . e>c{b,c,d,e}c<e,c<d
      • , wenn d < e, dann Compare(d,e)d<e
        • , wenn b > dCompare(b,d)b>d
          • . Fertig.Compare(b,e)
        • wenn b<d
          • . Fertig.Compare(b,c)
      • wenn d>e
        • wenn b > eCompare(b,e)b>e
          • . Fertig.Compare(b,d)
        • wenn b<e
          • . Fertig.Compare(b,c)

Alle oben genannten Wege führen zu höchstens drei Vergleichen nach erstem Vergleich von mit c . (bedeutet höchstens 7). ec


Sind Sie sicher, dass dies korrekt ist? Angenommen, Sie erhalten die folgenden Ergebnisse: a <b, c <d, a <c und dann c <e, b <e, c <b und d <e. Die Ordnungen a <c <b <d <e und a <c <d <b <e stimmen mit ihnen überein. Der Grund ist, dass b und d niemals implizit oder explizit verglichen werden. Vielleicht irre ich mich irgendwo, wenn ja, bitte korrigiere mich.
George
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.