Gibt es Standardbibliotheksaufrufe, mit denen ich entweder Set-Operationen für zwei Arrays ausführen oder diese Logik selbst implementieren kann (idealerweise so funktional und auch effizient wie möglich)?
99
Gibt es Standardbibliotheksaufrufe, mit denen ich entweder Set-Operationen für zwei Arrays ausführen oder diese Logik selbst implementieren kann (idealerweise so funktional und auch effizient wie möglich)?
Antworten:
Ja, Swift hat die
Set
Klasse.Swift 3.0+ kann Operationen an Sets ausführen als:
Swift 2.0 kann mit Array-Argumenten rechnen:
Swift 1.2+ kann auf Sätzen rechnen:
Wenn Sie benutzerdefinierte Strukturen verwenden, müssen Sie Hashable implementieren.
Vielen Dank an Michael Stern in den Kommentaren zum Swift 2.0 Update.
Vielen Dank an Amjad Husseini in den Kommentaren für die Hashable-Info.
quelle
set1.union(array2)
undset1.exclusiveOr(array2)
sind sowohl legitim, zusätzlich zu den Formen gezeigt oben.Es gibt keine Standardbibliotheksaufrufe, aber Sie können sich die ExSwift- Bibliothek ansehen . Es enthält eine Reihe neuer Funktionen für Arrays, einschließlich Differenz, Schnittmenge und Vereinigung.
quelle
Möglicherweise möchten Sie dem gleichen Muster wie in Objective-C folgen, in dem auch solche Operationen fehlen, aber es gibt eine einfache Problemumgehung:
Wie schneide ich zwei Arrays in Ziel C?
quelle
Die effizienteste Methode, die ich kenne, ist die Verwendung von Gödelnummern. Google für Godel-Codierung.
Die Idee ist so. Angenommen, Sie haben N mögliche Zahlen und müssen Sätze daraus erstellen. Zum Beispiel ist N = 100.000 und möchte Mengen wie {1,2,3}, {5, 88, 19000} usw. erstellen.
Die Idee ist, die Liste der N Primzahlen im Speicher zu behalten und für eine gegebene Menge {a, b, c, ...} als zu codieren
Sie codieren also einen Satz als BigNumber. Die Operationen mit BigNumbers sind immer noch sehr schnell, obwohl sie langsamer sind als Operationen mit Ganzzahlen.
Um 2 Sätze A, B zu vereinen, nehmen Sie
Das niedrigste gemeinsame Vielfache von A und B als A und B sind Mengen und beide Zahlen.
Um die Kreuzung zu machen, nehmen Sie
größter gemeinsamer Teiler.
und so weiter.
Diese Codierung wird als Godelisierung bezeichnet. Sie können nach mehr googeln. Die gesamte Sprache der Arithmetik, die mit der Logik von Frege geschrieben wurde, kann auf diese Weise mit Zahlen codiert werden.
Um die Operation zu bekommen, ist-Mitglied? es ist sehr einfach --
Um den Kardinal zu bekommen, ist es etwas komplizierter -
Sie zerlegen die Zahl S, die die Menge der Primfaktoren darstellt, und addieren deren Exponenten. Falls die Menge keine Duplikate zulässt, haben Sie alle Exponenten 1.
quelle