Existe-t-il des appels de bibliothèque standard que je peux utiliser pour effectuer des opérations d'ensemble sur deux tableaux ou implémenter moi-même une telle logique (idéalement aussi fonctionnellement et aussi efficacement que possible)?
Existe-t-il des appels de bibliothèque standard que je peux utiliser pour effectuer des opérations d'ensemble sur deux tableaux ou implémenter moi-même une telle logique (idéalement aussi fonctionnellement et aussi efficacement que possible)?
Réponses:
Oui, Swift a la Set
classe.
let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]
let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)
Swift 3.0+ peut effectuer des opérations sur des ensembles comme:
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Swift 2.0 peut calculer sur les arguments de tableau:
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Swift 1.2+ peut calculer sur des ensembles:
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
Si vous utilisez des structures personnalisées, vous devez implémenter Hashable.
Merci à Michael Stern dans les commentaires pour la mise à jour Swift 2.0.
Merci à Amjad Husseini dans les commentaires pour l'info Hashable.
set1.union(array2)
et set1.exclusiveOr(array2)
sont tous deux légitimes, en plus des formulaires présentés ci-dessus.
Il n'y a pas d'appels de bibliothèque standard, mais vous voudrez peut-être consulter la bibliothèque ExSwift . Il comprend un tas de nouvelles fonctions sur les tableaux, y compris la différence, l'intersection et l'union.
Vous voudrez peut-être suivre le même modèle que dans Objective-C, qui manque également de telles opérations, mais il existe une solution de contournement simple:
La méthode la plus efficace que je connaisse est d'utiliser des nombres de godel. Google pour l'encodage godel.
L'idée est ainsi. Supposons que vous ayez N nombres possibles et que vous deviez en faire des ensembles. Par exemple, N = 100 000 et souhaitez créer des ensembles tels que {1,2,3}, {5, 88, 19000}, etc.
L'idée est de garder la liste des N nombres premiers en mémoire et pour un ensemble donné {a, b, c, ...} vous l'encodez comme
prime[a]*prime[b]*prime[c]*...
Vous encodez donc un ensemble en tant que BigNumber. Les opérations avec BigNumbers, malgré le fait qu'elles soient plus lentes que les opérations avec des nombres entiers, sont toujours très rapides.
Pour réunir 2 ensembles A, B, vous prenez
UNITE(A, B) = lcm(a, b)
le plus petit commun multiple de A et B car A et B sont des ensembles et les deux nombres.
Pour faire l'intersection que vous prenez
INTERSECT(A, B) = gcd (a, b)
plus grand diviseur commun.
etc.
Cet encodage s'appelle godelization, vous pouvez google pour plus, tout le langage d'arithmétique écrit en utilisant la logique de Frege peut être encodé en utilisant des nombres de cette manière.
Pour obtenir l'opération est-membre? c'est très simple --
ISMEMBER(x, S) = remainder(s,x)==0
Pour obtenir le cardinal, c'est un peu plus compliqué -
CARDINAL(S) = # of prime factors in s
vous décomposez le nombre S représentant l'ensemble en produit des facteurs premiers et ajoutez leurs exposants. Dans le cas où l'ensemble n'autorise pas les doublons, vous aurez tous les exposants 1.