array functional-programming swift set-operations

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)?



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.