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


100

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


당신이 직접하고 싶다면 사전 위에 세트를 구현할 수 있습니다.
CodaFi

@CodaFi 고유성을 보장하기 위해 키를 사용한다는 의미입니까?
devios1 2014-07-05

`Dictionary <String, Void> 만 사용할 수 있습니까?
David Berry

답변:


184

예, 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에게 감사드립니다.


8
적어도 Swift 2.0부터는 배열을 이러한 함수에 대한 인수로 전달할 수 있습니다. 따라서, set1.union(array2)그리고 set1.exclusiveOr(array2)위에서 나타낸 형태 이외에, 모두 정당하다.
Michael Stern

5 개의 배열을 교차하려면 어떻게해야합니까? 아니면 6? 배열의 수를 알 수없는 경우 어떻게합니까?
Nathan McKaskle 2015

2
@Nathan 설정된 작업에 따라 다릅니다. 예를 들어 set union 및 set 교차는 교환 및 연관이므로 반복 또는 체인을 사용하여 많은 세트를 처리 할 수 ​​있습니다. 또는 Set union_all (...) 및 intersect_all (...)과 같이 var args를 사용하는 사용자 지정 메서드를 만들 수 있습니다.
joelparkerhenderson

예를 들어 입력 문자에 중복 문자가있을 수있는 $ 0이 $ 1의 애너그램인지 확인하기 위해 배열에 중복 값이 ​​포함되어 있으면 어떨까요?
Dave Kliman

1
사용자 정의 구조체를 사용하는 경우 당신은 당신이 복잡한 구조체가있는 경우 성가신 될 수있는 해쉬을 준수해야
암 자드 후세

0

표준 라이브러리 호출은 없지만 ExSwift 라이브러리 를 살펴볼 수 있습니다. 차이, 교차 및 합집합을 포함하여 배열에 대한 많은 새로운 기능이 포함됩니다.


1
주의 사항 : 저는 Swift 1.x에서 문제없이 ExSwift를 사용해 왔지만 Swift 2.x에서는 상당히 고장난 것처럼 보이며이 글을 쓰는 시점에서 몇 달 동안 업데이트되지 않았습니다. 더 많은 관심을받을 수있는 많은 포크가 있습니다.
Robin Macharg 2015 년


0

내가 아는 가장 효율적인 방법은 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이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.