Ya iki dizi üzerinde set işlemleri gerçekleştirmek ya da bu mantığı kendim uygulamak için kullanabileceğim standart kitaplık çağrıları var mı (ideal olarak işlevsel ve aynı zamanda mümkün olduğunca verimli)?
Ya iki dizi üzerinde set işlemleri gerçekleştirmek ya da bu mantığı kendim uygulamak için kullanabileceğim standart kitaplık çağrıları var mı (ideal olarak işlevsel ve aynı zamanda mümkün olduğunca verimli)?
Yanıtlar:
Evet, Set
sınıfta Swift var .
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+ setler üzerinde şu işlemleri yapabilir:
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Swift 2.0, dizi argümanlarını hesaplayabilir:
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Swift 1.2+ setlerde hesaplama yapabilir:
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
Özel yapılar kullanıyorsanız, Hashable'ı uygulamanız gerekir.
Swift 2.0 güncellemesinin yorumlarında Michael Stern'e teşekkürler.
Hashable bilgi için yorumlarda Amjad Husseini'ye teşekkürler.
set1.union(array2)
ve set1.exclusiveOr(array2)
yukarıda gösterilen biçimlerine ek olarak, her ikisi de meşru.
Herhangi bir standart kitaplık çağrısı yoktur, ancak ExSwift kitaplığına bakmak isteyebilirsiniz . Arrays üzerinde fark, kesişim ve birleşim gibi bir dizi yeni işlev içerir.
Bu tür işlemlerden yoksun olan Objective-C ile aynı kalıbı izlemek isteyebilirsiniz, ancak basit bir çözüm var:
Bildiğim en verimli yöntem, godel sayıları kullanmaktır. Godel kodlama için Google.
Fikir böyledir. Varsayalım, N olası sayınız var ve bunlardan setler yapmanız gerekiyor. Örneğin, N = 100.000 ve {1,2,3}, {5, 88, 19000} vb. Gibi kümeler yapmak istiyor.
Buradaki fikir, N asal sayı listesini bellekte tutmak ve belirli bir küme için {a, b, c, ...} olarak kodlamaktır.
prime[a]*prime[b]*prime[c]*...
Yani bir seti BigNumber olarak kodlarsınız. BigNumbers ile yapılan işlemler, Tamsayılarla yapılan işlemlerden daha yavaş olmalarına rağmen hala çok hızlı.
2 set A, B'yi birleştirmek için
UNITE(A, B) = lcm(a, b)
A ve B olarak A ve B'nin en düşük-ortak-katı kümeler ve her iki sayıdır.
Aldığın kavşağı yapmak için
INTERSECT(A, B) = gcd (a, b)
en büyük ortak böleni.
ve bunun gibi.
Bu kodlamaya gode bırakma denir, daha fazlası için google'da yapabilirsiniz, Frege mantığıyla yazılan tüm aritmetik dilleri bu şekilde sayılar kullanılarak kodlanabilir.
Operasyonu almak için üye olur mu? o çok basit --
ISMEMBER(x, S) = remainder(s,x)==0
Kardinali almak için biraz daha karmaşık -
CARDINAL(S) = # of prime factors in s
Asal çarpanlar çarpımındaki kümeyi temsil eden S sayısını ayrıştırır ve üslerini eklersiniz. Kümenin kopyalara izin vermemesi durumunda, tüm üslere sahip olacaksınız 1.