Vergleichen Sie zwei Scheiben
Gibt es eine Möglichkeit in der Go zu vergleichen, zwei Scheiben und Holen Sie sich die Elemente, die in der Scheibe X, die nicht in der Scheibe Y und Umgekehrt?
X := []int{10, 12, 12, 12, 13}
Y := []int{12, 14, 15}
func compare(X, Y []int)
calling compare(X, Y)
result1 := []int{10, 12, 12, 13} //if you're looking for elements in slice X that are not in slice Y
calling compare(Y, X)
result2 := []int{14, 15} //if you're looking for elements in slice Y that are not in slice X
Warum
Vermutlich, weil
in diesem Fall wird die
result1
enthalten 12
?Vermutlich, weil
X
enthält 3 unterschiedliche 12
Elemente, und Y
enthält 1. Die result1
Scheibe enthält zwei 12
s (oder 3 - 1
).in diesem Fall wird die
set
und set-difference
- tags entfernt werden sollte.InformationsquelleAutor jwesonga | 2014-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie dies funktionieren sollte:
http://play.golang.org/p/4DujR2staI
Die Komplexität dieser code ist eigentlich O(n*log(n)) (wenn Karte Komplexität ist O(log(n)), ich denke, es ist tatsächlich niedriger als es ist implementiert als eine (multi-level) hash-map).
Ich bin mir nicht sicher, ob die Leistung kann verbessert werden, wenn die Scheiben nicht sortiert. Wenn Sie sind so etwas wie Laremere Ansatz verwendet werden kann.
InformationsquelleAutor ctn
Wenn die Reihenfolge nicht wichtig ist, und die sets sind groß, Sie sollten verwenden Sie eine set-Implementierung und die diff-Funktion um Sie zu vergleichen.
Sets sind nicht Teil der standard-Bibliothek, aber Sie können diese Bibliothek verwenden, zum Beispiel, können Sie initialisieren eine Reihe automatisch aus einem Stück mit ihm. https://github.com/deckarep/golang-set
Etwas wie dieses:
Sie können nur diese Bibliothek und lege es in deinen source-tree, warum implementieren noch einen anderen Satz?
Als miku darauf hingewiesen, ich bin auf der Suche nach einer einfacheren Implementierung einer benutzerdefinierten Funktion
IMHO in diesem Fall sollten Sie nicht Schwitzen - es ist nicht weniger effizient oder etwas zu verwenden, einen vollständigen Satz der Umsetzung, und Sie hätte die Zeit, die Sie verbrachte die Umsetzung von it auf wichtigere Sachen - wie andere Funktionen. Oder debattieren die Sachen SO 😉
jemand hat deine Frage auf /r/golang, scheint, gibt es einige code zu ...
InformationsquelleAutor Not_a_Golfer
Alle Lösungen scheitern präzise Antwort auf die gestellte Frage. Statt die Unterschiede in den Scheiben, die Lösungen bieten, die Unterschiede der Sätze der Elemente in den Scheiben.
Speziell, anstelle der vorgesehenen Beispiel:
Den Lösungen führt:
Ausbeute streng der Beispiel-Ergebnis, eine andere Methode erforderlich ist. Hier sind zwei Lösungen:
Wenn die Scheiben bereits sortiert:
Kann diese Lösung schneller, wenn Sie die Art Ihre Scheiben, und rufen Sie dann vergleichen. Es wird definitiv schneller sein, wenn Sie Ihre Scheiben sind bereits sortiert.
Gehen Spielplatz version
Unsortierte Version mit Karten
Gehen Spielplatz version
Edit: habe ich einen benchmark für meine Prüfung in zwei Versionen (mit der Karte habe eine leichte Modifikation, wo es löscht die null-Werte aus der Karte). Es wird nicht ausgeführt, auf den Spielplatz Gehen, weil die Zeit nicht richtig funktioniert, so dass ich lief es auf meinem eigenen computer.
compareSort sortiert die Scheibe und ruft die iterierten version vergleichen, und compareSorted läuft afters compareSort, sondern verlässt sich auf die Scheibe bereits sortiert.
Wie Sie sehen können, wenn das array sortiert ist, nicht mit Karten ist viel schneller, aber mit Karten ist schneller als das Sortieren, und dann mit Hilfe der iterierten Ansatz. Für kleine Fälle, die Sortierung kann schnell genug, dass es verwendet werden soll, aber der benchmark fertig würde, schnell zu terminieren.
InformationsquelleAutor Laremere
Ziehen in eine set-Implementierung könnte zu viel des guten. Dies sollte genug sein:
Einen bloom-filter kann Hinzugefügt werden, wenn die Scheiben sehr groß.
IMHO ziehen in eine kopieren-einfügen halben Umsetzung einer Reihe ist schlimmer als importieren-Bibliothek, die macht genau das gleiche, vorausgesetzt es ist gut geschrieben und nicht aufgebläht.
Ich denke, es gibt Anwendungsfälle, wo Sie sind nicht schlechter dran, mit einem kleinen benutzerdefinierten Funktion, anstelle einer externen Bibliothek. Neben, auch wenn Sie in der Bibliothek die meiste Zeit, möchten Sie vielleicht, um wissen über eine einfache version sowieso.
Gehen Sie erleichtert die Wiederverwendung von code in einem so schönen Weg, es scheint überflüssig, das Rad neu erfinden in diesem Fall. Aber es ist fraglich. Es ist wahr, dass die Abhängigkeiten haben Ihre versteckten Kosten. Aber dann wieder, warum das Rad neu erfinden?
"Gehen Sie erleichtert die Wiederverwendung von code in einer so wunderschönen Art und Weise" mit seinem Mangel an Abhängigkeit Versionierung? Auch, es ist 17 loc ... nicht gerade das Rad neu erfinden.
InformationsquelleAutor Ilia Choly
Gibt es auch die github.com/mb0/diff - Paket (docs an godoc.org):
InformationsquelleAutor akavel