¿Hay alguna llamada de biblioteca estándar que pueda usar para realizar operaciones de conjunto en dos matrices o implementar dicha lógica yo mismo (idealmente, de la manera más funcional y eficiente posible)?
¿Hay alguna llamada de biblioteca estándar que pueda usar para realizar operaciones de conjunto en dos matrices o implementar dicha lógica yo mismo (idealmente, de la manera más funcional y eficiente posible)?
Respuestas:
Sí, Swift tiene la Set
clase.
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+ puede realizar operaciones en conjuntos como:
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Swift 2.0 puede calcular sobre argumentos de matriz:
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Swift 1.2+ puede calcular en conjuntos:
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
Si está utilizando estructuras personalizadas, debe implementar Hashable.
Gracias a Michael Stern en los comentarios por la actualización de Swift 2.0.
Gracias a Amjad Husseini en los comentarios por la información de Hashable.
set1.union(array2)
y set1.exclusiveOr(array2)
ambos son legítimos, además de los formularios mostrados anteriormente.
No hay llamadas de biblioteca estándar, pero es posible que desee consultar la biblioteca ExSwift . Incluye un montón de funciones nuevas en Arrays que incluyen diferencia, intersección y unión.
Es posible que desee seguir el mismo patrón que en Objective-C, que también carece de tales operaciones, pero hay una solución simple:
El método más eficiente que conozco es el uso de números godel. Google para codificación godel.
La idea es así. Suponga que tiene N números posibles y necesita hacer conjuntos de ellos. Por ejemplo, N = 100.000 y desea crear conjuntos como {1,2,3}, {5, 88, 19000}, etc.
La idea es mantener la lista de N números primos en la memoria y para un conjunto dado {a, b, c, ...} se codifica como
prime[a]*prime[b]*prime[c]*...
Así que codificas un conjunto como BigNumber. Las operaciones con BigNumbers, a pesar de que son más lentas que las operaciones con Integers, siguen siendo muy rápidas.
Para unir 2 conjuntos A, B, toma
UNITE(A, B) = lcm(a, b)
mínimo común múltiplo de A y B, ya que A y B son conjuntos y ambos números.
Para hacer la intersección que tomas
INTERSECT(A, B) = gcd (a, b)
máximo común divisor.
y así.
Esta codificación se llama godelización, puedes buscar más en Google, todo el lenguaje de la aritmética escrito usando la lógica de Frege se puede codificar usando números de esta manera.
Para conseguir la operación is-member? Es muy simple --
ISMEMBER(x, S) = remainder(s,x)==0
Conseguir el cardenal es un poco más complicado.
CARDINAL(S) = # of prime factors in s
descompone el número S que representa el conjunto en producto de factores primos y suma sus exponentes. En caso de que el conjunto no permita duplicados, todos los exponentes serán 1.