[functional-programming] Swift 배열에서 작업 (연합, 교차)을 설정 하시겠습니까?

두 배열에서 집합 작업을 수행하거나 이러한 논리를 직접 구현하는 데 사용할 수있는 표준 라이브러리 호출이 있습니까 (이상적으로는 가능한 한 기능적으로도 효율적으로)?



답변

예, 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에도 이러한 작업이 없습니다.하지만 간단한 해결 방법이 있습니다.

객관적인 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이됩니다.


답변