Imposta le operazioni (unione, intersezione) sull’array Swift?

Ci sono delle chiamate standard alle librerie che posso usare per eseguire operazioni su due array, o implementare tale logica da solo (idealmente nel modo più funzionale ed efficiente ansible)?

Sì, Swift ha la class Set .

 let array1 = ["a", "b", "c"] let array2 = ["a", "b", "d"] let set1:Set = Set(array1) let set2:Set = Set(array2) 

Swift 3.0+ può eseguire operazioni su insiemi 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 sui set:

 set1.union(set2) // {"a", "b", "c", "d"} set1.intersect(set2) // {"a", "b"} set1.subtract(set2) // {"c"} set1.exclusiveOr(set2) // {"c", "d"} 

Se si utilizzano le strutture personalizzate, è necessario implementare Hashable.

Grazie a Michael Stern nei commenti per l’aggiornamento Swift 2.0.

Grazie ad Amjad Husseini nei commenti per le informazioni di Hashable.

Il metodo più efficiente che conosco è l’uso dei numeri di Godel. Google per la codifica Godel.

L’idea è così. Supponiamo di avere N numeri possibili e di doverne creare dei set. Ad esempio, N = 100.000 e vuoi creare insiemi come {1,2,3}, {5, 88, 19000} ecc.

L’idea è di mantenere la lista dei N numeri primi in memoria e per un dato insieme {a, b, c, …} la codi

  prime[a]*prime[b]*prime[c]*... 

Quindi codi un set come un BigNumber. Le operazioni con BigNumbers, nonostante siano più lente delle operazioni con Integers, sono ancora molto veloci.

Per unire 2 set A, B, prendi

  UNITE(A, B) = lcm(a, b) 

il multiplo comune più basso di A e B come A e B sono insiemi ed entrambi i numeri.

Per rendere l’intersezione che si prende

  INTERSECT(A, B) = gcd (a, b) 

massimo comun divisore.

e così via.

Questa codifica è chiamata godelizzazione, puoi google di più, 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 

decomponi il numero S che rappresenta l’insieme nel prodotto di fattori primi e aggiungi i loro esponenti. Nel caso in cui il set non consenta duplicati avrai tutti gli esponenti 1.

Non ci sono chiamate standard alle librerie, ma potresti voler guardare la libreria ExSwift . Include un sacco di nuove funzioni sugli array tra cui differenza, intersezione e unione.

Si consiglia di seguire lo stesso schema di Objective-C, che non dispone di tali operazioni, ma esiste una soluzione semplice:

come intersecare due array nell’objective C?