functional programming - array - Establecer las operaciones(unión, intersección) en la matriz Swift?
swift 4 array map (4)
El método más eficiente que conozco es usar números de Godel. Google para la codificación de godel.
La idea es así. Supongamos que tiene N números posibles y necesita hacer conjuntos de ellos. Por ejemplo, N = 100,000 y quiere hacer 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, ...} usted la codifica como
prime[a]*prime[b]*prime[c]*...
Entonces codifica un conjunto como BigNumber. Las operaciones con BigNumbers, a pesar de ser más lentas que las operaciones con números enteros, son 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 como 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 godelization, puedes buscar más en Google, todo el lenguaje de los aritméticos escritos usando la lógica de Frege puede codificarse usando números de esta manera.
Para obtener la operación ¿es miembro? Es muy simple --
ISMEMBER(x, S) = remainder(s,x)==0
Para obtener el cardenal es un poco más complicado,
CARDINAL(S) = # of prime factors in s
descompones el número S que representa el conjunto en producto de factores primos y añades sus exponentes. En caso de que el conjunto no permita duplicados, tendrás todos los exponentes 1.
¿Hay alguna llamada estándar de biblioteca que pueda usar para realizar operaciones de conjunto en dos matrices, o implementar esa lógica yo mismo (idealmente de la manera más funcional y eficiente posible)?
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 alternativa:
No hay llamadas de biblioteca estándar, pero es posible que desee consultar la biblioteca ExSwift . Incluye una serie de funciones nuevas en Arrays que incluyen diferencia, intersección y unión.
Sí, Swift tiene la clase Set
.
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 hacer 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 en 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 para la actualización de Swift 2.0.
Gracias a Amjad Husseini en los comentarios sobre la información Hashable.