Alle Kombinationen der Paare in einem Satz
Möchte ich berechne alle möglichen Listen von Paaren, Sie könnte einen Satz. Zum Beispiel:
input = [1, 2, 3, 4, 5, 6]
output = {[(1,2), (3,4), (5,6)],
[(2,3), (4,5), (1,6)],
[(2,4), (1,3), (5,6)],
[...], .... }
Hinweis: in diesem Beispiel sind nur einige zufällige Dinge, die in der Ausgabe, die meisten entfernt. Ich kümmern sich nicht um die Reihenfolge der Listen oder die Paare innerhalb dieser Listen.
Ich denke, es wäre (n-1)(n-3)(n-5)...
möglich, Listen von Paaren. Zuerst dachte ich, Sie könnte alle Permutationen der Eingabe-Liste. Mit all diesen Permutationen könnten Sie das erste mit dem zweiten Element und der Dritte mit der vierten. Aber offensichtlich ist das sehr ineffizient, weil Sie machen würde n!
Elemente in der Liste und Sie würden nur noch (n-1)(n-3)(n-5)...
. Konnte einige mir einen Tipp geben wie dies zu tun ist effizienter? Gibt es einen bekannten Algorithmus oder was wären die richtigen Stichworte, um eine Suche mit? Ich möchte, um dies zu implementieren, in JAVA, also, wenn Sie wollen, um die Verwendung der Collections-Klasse in JAVA kein problem 🙂
Um deutlicher zu sein: die Eingabe immer aus einer geraden Anzahl von Elementen, so dass alle Paare in einer Liste zusammen, sind alle Elemente in der Eingabe.
Edit:
Ich schauen mal für alle Antwort. Jetzt habe ich zu arbeiten-code-vielen Dank dafür. Aber ich brauche es für eine Eingabe mit der Größe n = 26
:(. Ich habe nicht alles umgesetzt, aber ich denke, es wird für eine Weile laufen :(.
- Sie sind gefragt, für Partitionen, die in Paare? Es wird mehr als
n(n-1)/
2 von denen. Es werde C(n,2) * C(n-2,2)*... - Deine Ausgabe zeigt
(5,6)
zweimal aufgeführt. Ist das nur ein Fehler??? - Es gibt
n!/[2^(n/2)*(n/2)!]
verschiedenen Paarungen, so dass Ihre n! die Lösung ist nicht so eine Verschwendung. - Ich habe bearbeitet die Höhe der verschiedenen Paarungen und ich bin mir ziemlich sicher, dass es nun korrigieren. Suchen Sie die Erklärung unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich das richtig verstanden, eine rekursive Lösung dieses Problems sollte ganz einfach sein:
Den Teil mit hinzufügen und entfernen der Elemente ist nicht wirklich enthalten in diesem Beispiel die Umsetzung, denn es erstellt eine Liste und einen neuen Satz für das iterative und das rekursive aufrufen, aber die Idee sollte klar sein.
Bearbeiten: Mein voriger post war teilweise falsch. Ich wusste nicht, kümmerte sich um OP ' s Satz "I don' T care über die Reihenfolge der Listen oder die Paare innerhalb dieser Listen".
Was Sie fordern, sind aufgerufen, eine perfekte Paarung (matching). Die Anzahl der Paare ist n*(n+1)/2, aber die Anzahl der koppeln ist
(n-1)*(n-3)*(n-5)*...
in der Tat sind die MöglichkeitenHier 5*3*1 = 15. Ich bin kein erfahrener java-Benutzer, so Schreibe ich es in Python. Ich bin mit einem rekursiven Algorithmus.
Gibt:
[(1, 2), (3, 4), (5, 6)]
[(1, 2), (3, 5), (4, 6)]
[(1, 2), (3, 6), (4, 5)]
[(1, 3), (2, 4), (5, 6)]
[(1, 3), (2, 5), (4, 6)]
[(1, 3), (2, 6), (4, 5)]
[(1, 4), (2, 3), (5, 6)]
[(1, 4), (2, 5), (3, 6)]
[(1, 4), (2, 6), (3, 5)]
[(1, 5), (2, 3), (4, 6)]
[(1, 5), (2, 4), (3, 6)]
[(1, 5), (2, 6), (3, 4)]
[(1, 6), (2, 3), (4, 5)]
[(1, 6), (2, 4), (3, 5)]
[(1, 6), (2, 5), (3, 4)]
Hinweis: ich habe nicht versucht, Sie zu optimieren und mit intelligenten Daten-Strukturen. Insbesondere die Verwendung doppelt verkettete Liste kann man vermeiden, kopieren
choice
undl1
.Können Sie Guave ist Sets#cartesianProduct
Ergeben:
Dann können Sie entfernen Sie Elemente, wie
[1, 1]
und so weiterdie erste Sache, die kommen würde, in jemandes Geist ist die Permutaions oder die Kollektionen so, dass Sie bereits erwähnt haben, ist nicht sehr effizient.
Lassen Sie uns mit einer Frage beginnen, sind Sie komfortabel mit Binär-Zahlen?
Sie haben zu einer echten Besonderheit, Sie stellen nur zwei Staaten, D. H. das Vorhandensein(1) oder fehlen(0).
Wenn Sie auf der Suche für eine schnelle Codierung-Lösung, hier gehen Sie. Wenn Sie daran interessiert sind, das Konzept, Lesen Sie weiter:
Erklärung:
Lassen Sie uns annehmen, wir haben drei Zeichen (a, b, c) und wir wollen finden, dass alle Paare:
Nun davon ausgehen, ein drei-bit-integer, lassen Sie uns notieren alle möglichen ganzen zahlen von drei bits:
Wählen Sie nun die Zahl mit zwei high-bits also wäre ( 3, 5, 6)
Wählen Sie nun die Indizes der high-bits aus der ersten Reihe 3, so