Angenommen, Sie haben eine Reihe von Mengen von ganzen Zahlen. Es ist möglich, dass sich einige der Sets überschneiden (dh Elemente gemeinsam nutzen). Sie könnten die Überlappungen beseitigen, indem Sie Elemente aus den Sets löschen. Einige davon könnten jedoch leer sein. dass wäre eine Schande. Können wir alle Sätze disjunkt machen, ohne sie zu leeren?
Beachten Sie, dass es in dieser Situation keinen Grund gibt, mehrere Elemente in einem Satz zu belassen. Daher kann dieses Problem immer gelöst werden, indem jeder Satz auf nur ein Element reduziert wird. Das ist die Version des Problems, das wir hier lösen.
Die Aufgabe
Schreiben Sie ein Programm oder eine Funktion wie folgt:
Eingabe : Eine Liste von Ganzzahlensätzen.
Ausgabe : Eine Liste von Ganzzahlen mit der gleichen Länge wie die Eingabe, für die:
- Alle Ganzzahlen in der Ausgabe sind unterschiedlich. und
- Jede Ganzzahl in der Ausgabe ist ein Element der entsprechenden Menge der Eingabe.
Klarstellungen
- Sie können eine Menge als Liste darstellen, wenn Sie dies wünschen (oder was auch immer für Ihre Sprache geeignet ist), ohne die Reihenfolge der Elemente zu berücksichtigen.
- Sie müssen den Fall nicht behandeln, in dem keine Lösung vorhanden ist (dh es wird immer mindestens eine Lösung geben).
- Möglicherweise gibt es mehr als eine Lösung. Ihr Algorithmus muss immer eine gültige Lösung erstellen, darf jedoch nicht deterministisch sein (dh es ist in Ordnung, wenn er bei jeder Ausführung eine andere gültige Lösung auswählt).
- Die Anzahl der verschiedenen Ganzzahlen, die in der Eingabe n erscheinen, entspricht der Anzahl der Mengen in der Eingabe und der Einfachheit halber sind die Ganzzahlen von 1 bis einschließlich n (da ihre tatsächlichen Werte keine Rolle spielen). Es liegt an Ihnen, ob Sie diese Tatsache ausnutzen möchten oder nicht.
Testfälle
[{1,2},{1,3},{1,4},{3,4}] -> [2,3,1,4] or [2,1,4,3]
[{1,3},{1,2,4},{2,3},{3},{2,3,4,5}] -> [1,4,2,3,5]
[{1,3,4},{2,3,5},{1,2},{4,5},{4,5}] -> [1,3,2,4,5] or [3,2,1,4,5] or [1,3,2,5,4] or [3,2,1,5,4]
Siegbedingung
Ein Programm benötigt eine optimale Zeitkomplexität , um zu gewinnen. Wenn also ein Algorithmus mit einer besseren Zeitkomplexität gefunden wird, werden alle langsameren Einträge disqualifiziert. (Sie können davon ausgehen, dass die integrierten Funktionen Ihrer Sprache so schnell wie möglich ausgeführt werden, z. B. können Sie davon ausgehen, dass eine integrierte Sortierung in der Zeit O (n log n) ausgeführt wird. Ebenso können Sie davon ausgehen, dass alle Ganzzahlen mit einer vergleichbaren Größe wie n addiert, multipliziert usw. in konstanter Zeit.)
Da es in den meisten Sprachen wahrscheinlich ziemlich einfach ist, eine optimale Zeitkomplexität zu erhalten, ist der Gewinner das kürzeste Programm unter denjenigen mit der in Bytes gemessenen Zeitkomplexität.
quelle
Antworten:
Gelee , 8 Bytes
Probieren Sie es online aus!
Erläuterung
Extrem ineffizient. Asymptotisch
ϴ(n^(n+1))
nach Mischa Lawrow; Ich denke es ist richtig.quelle
unique
Funktion in Jelly UseO(n)
Containment (x in s
) Check, sollte jederO(n)
gemäß dieser Seite nehmen ,Q
sollte alsoO(n^2)
Worst-Case / durchschnittliche Fall-Zeit-Komplexität nehmen. Daher ist der AlgorithmusO(n^(n+2))
. (Eindeutig kann sein,O(n)
wenn alle Elemente gleich sind, wobei jede Containment-Prüfung ausgeführt wird.O(1)
) --- In einem anderen Zusammenhang ist es möglich, eineunique
inO(n)
Python integrierteset
Datenstruktur zu implementieren , die Hash-Set ist. Wie auch immer, Jelly ist nicht darauf ausgelegt, effizient zu sein.Wolfram Language (Mathematica) , 87 Bytes und ϴ (n 3 )
Probieren Sie es online aus!
Erstellt ein zweigeteiltes Diagramm, dessen Scheitelpunkte auf der einen Seite die Mengen sind (indiziert durch
-1,-2,...,-n
) und dessen Scheitelpunkte auf der anderen Seite die Elemente sind1,2,...,n
, wobei eine Kante von-i
bisj
wannj
in deri
-ten Menge enthalten ist. Findet mithilfe eines integrierten Geräts eine perfekte Übereinstimmung in diesem Diagramm. Listet dann die Elemente auf, die-1,-2,...,-n
in dieser Reihenfolge in perfekter Übereinstimmung entsprechen.Mathematica
FindIndependentEdgeSet
ist hier der Engpass; Alles andere erfordert O (n 2 ) -Operationen. Mathematica verwendet wahrscheinlich den ungarischen Algorithmus , und daher gehe ich davon aus, dass er in ϴ (n 3 ) ausgeführt wird, obwohl es möglich ist, dass Mathematica eine naive Implementierung mit O (n 4 ) -Komplexität hat.quelle
Haskell , 48 Bytes
-1 Byte dank Nimi.
Probieren Sie es online aus!
quelle
mapM id
stattsequence
Mathematica 39 Bytes
In Bezug auf die Komplexität denke ich, dass dies sehr stark von der Länge jeder Unterliste sowie von einem Maß dafür abhängt, wie unzusammenhängend die Unterlisten sind.
Ich denke also, dieser Algorithmus ist O (n Log n + n ^ 2 Log m), wobei m ungefähr die durchschnittliche Länge jeder Unterliste ist.
So etwas hätte die Komplexität O (a ^ n), wobei a> 1 ein Maß für die Überlappung in Unterlisten ist:
Schwer zu sagen, was wirklich schneller ist, ohne die Eigenschaften möglicher Eingaben zu kennen.
quelle
DeleteDuplicates /@ Tuples@#
Schritt benötigt ϴ (n ^ (n + 1)) Zeit mit denselben Argumenten wie in den anderen Lösungen. DannUnion
muss eine Liste mit der Länge n ^ n sortiert werden, was O (n ^ (n + 1) log (n)) Zeit kostet - aber vielleicht ist es schneller, da höchstens 2 ^ nn! Elemente in dieser Liste sind unterschiedlich. In jedem Fall beträgt die Komplexität ϴ (n ^ (n + 1)) bis zu einem log (n) -Faktor.Tuples@#
die Größe 2 ^ n hat, kann Ihre erste asymptotische Schätzung unmöglich sein.05AB1E , 13 Bytes, O (n! * N)
Probieren Sie es online aus! Erläuterung:
quelle
Schale , 5 Bytes
Probieren Sie es online aus!
Erläuterung
Ich habe gerade die Sache mit der Komplexität gesehen: Wie so oft bei der Lösung von Golfsprachen sind sie nicht sehr effizient - diese hat die Komplexität O (n · nⁿ).
quelle
Pyth , 9 Bytes (ϴ (n n + 1 ))
Da dies genau wie die Jelly-Lösung funktioniert, hat sie höchstwahrscheinlich die gleiche Komplexität.
Probieren Sie es hier aus!
Wie?
quelle
JavaScript (ES6),
7473 Byte1 Byte gespeichert, dank @Neil.
Durchläuft das Array rekursiv und sucht nach einer Lösung.
Ungolfed:
Testfälle:
Code-Snippet anzeigen
quelle
a?a.map(
...)&&S:s
?Python3,
9384 Bytes-9 Bytes dank Caird Coinheringaahing
Probieren Sie es online aus!
quelle