두 배열에서 집합 작업을 수행하거나 이러한 논리를 직접 구현하는 데 사용할 수있는 표준 라이브러리 호출이 있습니까 (이상적으로는 가능한 한 기능적으로도 효율적으로)?
두 배열에서 집합 작업을 수행하거나 이러한 논리를 직접 구현하는 데 사용할 수있는 표준 라이브러리 호출이 있습니까 (이상적으로는 가능한 한 기능적으로도 효율적으로)?
답변:
예, 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에게 감사드립니다.
set1.union(array2)
그리고 set1.exclusiveOr(array2)
위에서 나타낸 형태 이외에, 모두 정당하다.
표준 라이브러리 호출은 없지만 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이됩니다.