두 배열에서 집합 작업을 수행하거나 이러한 논리를 직접 구현하는 데 사용할 수있는 표준 라이브러리 호출이 있습니까 (이상적으로는 가능한 한 기능적으로도 효율적으로)?
답변
예, Swift에는 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+는 다음과 같이 세트에서 작업을 수행 할 수 있습니다.
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Swift 2.0은 배열 인수를 계산할 수 있습니다.
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Swift 1.2+는 세트에서 계산할 수 있습니다.
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
사용자 지정 구조체를 사용하는 경우 Hashable을 구현해야합니다.
Swift 2.0 업데이트에 대한 의견에 Michael Stern에게 감사드립니다.
Hashable 정보에 대한 의견에 Amjad Husseini에게 감사드립니다.
답변
표준 라이브러리 호출은 없지만 ExSwift 라이브러리 를 살펴볼 수 있습니다. 차이, 교차 및 합집합을 포함하여 배열에 대한 많은 새로운 기능이 포함됩니다.
답변
Objective-C와 동일한 패턴을 따르고 싶을 수도 있습니다. Objective-C에도 이러한 작업이 없습니다.하지만 간단한 해결 방법이 있습니다.
답변
내가 아는 가장 효율적인 방법은 godel 번호를 사용하는 것입니다. Godel 인코딩을위한 Google.
아이디어는 그렇습니다. N 개의 가능한 숫자가 있고 그 세트를 만들어야한다고 가정합니다. 예를 들어 N = 100,000이고 {1,2,3}, {5, 88, 19000} 등과 같은 세트를 만들고 싶습니다.
아이디어는 N 소수의 목록을 메모리에 유지하고 주어진 세트 {a, b, c, …}에 대해 다음과 같이 인코딩하는 것입니다.
prime[a]*prime[b]*prime[c]*...
따라서 집합을 BigNumber로 인코딩합니다. BigNumbers를 사용한 작업은 Integer를 사용한 작업보다 느리지 만 여전히 매우 빠릅니다.
2 세트 A, B를 결합하려면
UNITE(A, B) = lcm(a, b)
A와 B로서 A와 B의 최하 공배수는 세트와 두 숫자입니다.
교차로를 만들려면
INTERSECT(A, B) = gcd (a, b)
최대 공약수.
등등.
이 인코딩을 godelization이라고합니다. Google에서 더 많은 정보를 얻을 수 있습니다. Frege의 논리를 사용하여 작성된 모든 산술 언어는 이러한 방식으로 숫자를 사용하여 인코딩 할 수 있습니다.
작전을 얻으려면 회원입니까? 매우 간단합니다.
ISMEMBER(x, S) = remainder(s,x)==0
추기경을 얻으려면 조금 더 복잡합니다.
CARDINAL(S) = # of prime factors in s
소인수의 곱으로 집합을 나타내는 숫자 S를 분해하고 지수를 더합니다. 집합이 중복을 허용하지 않는 경우 모든 지수가 1이됩니다.