Esistono chiamate di libreria standard che posso utilizzare per eseguire operazioni sugli insiemi su due array o implementare personalmente tale logica (idealmente nel modo più funzionale ed efficiente possibile)?
Esistono chiamate di libreria standard che posso utilizzare per eseguire operazioni sugli insiemi su due array o implementare personalmente tale logica (idealmente nel modo più funzionale ed efficiente possibile)?
Risposte:
Sì, Swift ha la Setclasse.
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+ può eseguire operazioni sui set come:
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Swift 2.0 può calcolare sugli argomenti dell'array:
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Swift 1.2+ può calcolare su set:
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
Se stai usando strutture personalizzate, devi implementare Hashable.
Grazie a Michael Stern nei commenti per l'aggiornamento Swift 2.0.
Grazie ad Amjad Husseini nei commenti per le informazioni Hashable.
set1.union(array2)e set1.exclusiveOr(array2)sono entrambi legittimi, oltre alle forme sopra indicate.
Non ci sono chiamate di libreria standard, ma potresti voler guardare la libreria ExSwift . Include un sacco di nuove funzioni sugli array, tra cui differenza, intersezione e unione.
Potresti voler seguire lo stesso schema di Objective-C, che manca anche di tali operazioni, ma c'è una semplice soluzione:
Il metodo più efficiente che conosco è usare i numeri Godel. Google per la codifica godel.
L'idea è così. Supponiamo di avere N numeri possibili e di doverne creare insiemi. Ad esempio, N = 100.000 e vuoi creare insiemi come {1,2,3}, {5, 88, 19000} ecc.
L'idea è di tenere in memoria l'elenco di N numeri primi e per un dato insieme {a, b, c, ...} lo codifichi come
prime[a]*prime[b]*prime[c]*...
Quindi codifichi un set come BigNumber. Le operazioni con BigNumbers, nonostante siano più lente delle operazioni con Integers, sono comunque molto veloci.
Per unire 2 set A, B, prendi
UNITE(A, B) = lcm(a, b)
multiplo più basso comune di A e B poiché A e B sono insiemi ed entrambi i numeri.
Per fare l'incrocio che prendi
INTERSECT(A, B) = gcd (a, b)
massimo comun divisore.
e così via.
Questa codifica è chiamata godelizzazione, puoi cercare di più su google, tutto il linguaggio dell'aritmetica scritto usando la logica di Frege può essere codificato usando i numeri in questo modo.
Per ottenere l'operazione è membro? è molto semplice -
ISMEMBER(x, S) = remainder(s,x)==0
Per ottenere il cardinale è un po 'più complicato -
CARDINAL(S) = # of prime factors in s
scomponi il numero S che rappresenta l'insieme in prodotto di fattori primi e aggiungi i loro esponenti. Nel caso in cui l'insieme non consenta duplicati avrai tutti gli esponenti 1.