Czy istnieją jakieś standardowe wywołania biblioteki, których mogę użyć do wykonania operacji na dwóch tablicach lub do samodzielnego wdrożenia takiej logiki (najlepiej tak funkcjonalnie i wydajnie, jak to tylko możliwe)?
100
Czy istnieją jakieś standardowe wywołania biblioteki, których mogę użyć do wykonania operacji na dwóch tablicach lub do samodzielnego wdrożenia takiej logiki (najlepiej tak funkcjonalnie i wydajnie, jak to tylko możliwe)?
Odpowiedzi:
Tak, Swift ma
Set
klasę.Swift 3.0+ może wykonywać operacje na zestawach jako:
Swift 2.0 może obliczyć na argumentach tablicowych:
Swift 1.2+ potrafi obliczyć na zestawach:
Jeśli używasz niestandardowych struktur, musisz zaimplementować Hashable.
Podziękowania dla Michaela Sterna w komentarzach do aktualizacji Swift 2.0.
Podziękowania dla Amjada Husseiniego w komentarzach za informację Hashable.
źródło
set1.union(array2)
aset1.exclusiveOr(array2)
oba uzasadnione, oprócz postaci przedstawionych powyżej.Nie ma żadnych standardowych wywołań bibliotek, ale możesz zajrzeć do biblioteki ExSwift . Zawiera kilka nowych funkcji w tablicach, w tym różnicę, przecięcie i sumę.
źródło
Możesz chcieć zastosować ten sam wzorzec, co w Objective-C, w którym również brakuje takich operacji, ale istnieje proste obejście:
jak przeciąć dwie tablice w celu C?
źródło
Najbardziej wydajną metodą, jaką znam, jest użycie liczb Godela. Google do kodowania godel.
Pomysł jest taki. Załóżmy, że masz N możliwych liczb i musisz utworzyć z nich zestawy. Na przykład N = 100 000 i chcesz tworzyć zestawy takie jak {1,2,3}, {5, 88, 19000} itd.
Chodzi o to, aby zachować listę N liczb pierwszych w pamięci i dla danego zbioru {a, b, c, ...} zakodować ją jako
Więc kodujesz zestaw jako BigNumber. Operacje na BigNumbers, mimo że są wolniejsze niż operacje na liczbach całkowitych, są nadal bardzo szybkie.
Aby połączyć 2 zestawy A, B, bierzesz
najmniejsza wspólna wielokrotność A i B jako A i B to zbiory i obie liczby.
Aby zrobić skrzyżowanie, które wybierzesz
Największy wspólny dzielnik.
i tak dalej.
To kodowanie nazywa się godelizacją, możesz wygooglować więcej, cały język arytmetyki zapisany przy użyciu logiki Fregego można zakodować za pomocą liczb w ten sposób.
Aby uzyskać operację jest członkiem? to bardzo proste --
Zdobycie kardynała jest trochę bardziej skomplikowane -
rozkładasz liczbę S reprezentującą zbiór na iloczyn czynników pierwszych i dodajesz ich wykładniki. W przypadku, gdy zestaw nie pozwala na duplikaty, będziesz mieć wszystkie wykładniki 1.
źródło