본문 바로가기

iOS/Swift

[Swift] Collection Type - Set 알아보기

목차)
1. Set 이란?
    1) 특징
    2) 성능 분석 ( vs Array )
        [1] 시간 복잡도
        [2] Set vs Array

2. 예시 코드
  1) 합집합
  2) 교집합
  3) 차집합
  4) 여집합
  5) 상위집합
  6) 부분집합

1. Set 이란?

1) 특징

Set 은 고유한 값들의 묶음을 나타내는 Collection Type 이다.

중복된 값을 가지지 않고, 고유한 값만을 저장해야 할 때 사용한다.

 

[1] 고유한 값

Set 은 중복된 값을 허용하지 않는다.
Set type 에 동일한 값을 여러번 추가해도, 하나의 값만을 저장한다.

 

[2] 순서 없음

Set 은 요소의 순서가 없으며 보장하지 않는다.
그러므로 index 로 요소에 접근할 수 없다.

 

[3] Equatable 프로토콜 준수

Set 은 값들을 비교하기 위해 Equatable 프로토콜을 준수한다.

요소들간 고유한 값인지 비교하며,
Set 프로토콜을 준수하는 Collection 간의 요소들을 비교하여 같은 요소들을 가지고 있는지 아닌지 비교한다.

 

//예시
let num_v1:Set = [1,2,3]
let num_v2:Set = [3,2,1]

print(num_v1 == num_v2) // true

 

[4] 집합 연산 수행

다양한 집합 연산을 수행할 수 있다.
( 합집합, 교집합, 차집합, 여집합, 부분집합, 진부분집합, 상위집합, 진상위집합 )

2) 성능 분석 ( vs Array )

[1] 시간 복잡도

Set 은 Hash 기반의 데이터 구조이다.

 

Hash 기반의 데이터 구조는 각 요소에 고유한 hash값을 사용하여, 요소를 저장하고 검색하는 방식을 말한다.

 

이러한 Set 의 구조는 검색, 삽입, 삭제에 대한 성능이 우수하며, 평균적으로 O(1)의 시간 복잡도를 가진다.

 

O(1) 이란?

'빅오 원' 또는 '상수 시간' 이라고 읽는다.

O(1)의 의미는 알고리즘의 실행시간이 입력크기에 관계없이 일정하다는 것을 의미한다.

즉, 입력 크기에 상관없이 동일한 시간이 소요되므로 가장 효율적인 실행 시간 복잡도로 간주된다.

O(n) 이란?

'빅오 엔' 이라고 읽는다.

입력크기가 n 일 때, 알고리즘 실행 시간이 입력 크기에 비례하여 증가한다.

[2] Set vs Array

  Set Array
검색   Hash기반의 데이터 구조로 검색 성능이 매우 빠르다.

  O(1) 시간에 찾을 수 있다.
 
  요소의 index로 검색한다.

  index에 따라 검색성능이 달라 진다.

  최선의 경우인 첫번째 요소 검색시에는 O(1) 이지만,
  최악의 경우인 마지막 요소 검색시에는 O(n) 이다.

삽입 / 삭제   Hash기반의 데이터 구조로 평균적으로 O(1) 시간안에
  삽입, 삭제가 가능하다.
 
  요소들의 index를 유지하기 위해, 중간에 요소를
  삽입하거나, 삭제할 경우 다른 요소들을 이동시켜야 한다.

  이로 인해 O(n) 시간이 걸린다.

순회  
  Set은 순서를 보장하지 않으므로, 순회를 하기 위해 요소를
  하나씩 가져오는 방식을 사용한다.

  평균적으로 O(n)의 시간복잡도를 가진다.

  Arrayindex기반의 순회가 가능하며,
  요소들에 연속적인 접근이 가능하여 빠른 성능을 가진다.

  O(n)의 시간복잡도를 가진다.

2. 예시 코드

1) 합집합

union( _: )

 

- 두개의 Set 을 합쳐 모든 요소들의 집합을 반환

 

let set1: Set<Int> = [1, 2, 3]
let set2: Set<Int> = [3, 4, 5]

let union = set1.union(set2)

print(union) //출력: [1,2,3,4,5]

2) 교집합

intersection( _: )

 

- 두 개의 Set 에서 공통으로 포함된 요소들의 집합을 반환

 

let set1: Set<Int> = [1, 2, 3, 4]
let set2: Set<Int> = [3, 4, 5, 6]

let intersection = set1.intersection(set2)

print(intersection) //출력: [3,4]

3) 차집합

subtracting( _: )

 

- 첫 번째 Set에서 두 번째 Set에 포함된 요소들을 제외한 집합을 반환

 

let set1: Set<Int> = [1, 2, 3, 4]
let set2: Set<Int> = [3, 4, 5]

let subtraction = set1.subtracting(set2) 

print(subtraction) //출력: [1,2]

4) 여집합

symmetricDifference( _: )

 

- 두개의 Set에서 각 각에만 속하는 요소들의 집합을 반환

 

let set1: Set<Int> = [1, 2, 3, 4]
let set2: Set<Int> = [3, 4, 5, 6]

let symmetricDifference = set1.symmetricDifference(set2

print(symmetricDifference) // [1,2,5,6]

5) 상위집합

isSuperset( _: )

 

- 한 Set이 다른 Set의 상위집합인지 판단하여 boolean 값을 반환

 

let set1: Set<Int> = [1, 2, 3, 4]
let set2: Set<Int> = [1, 2]

let isSuperset = set1.isSuperset(of: set2)

print(isSuperset) //true

6) 부분집합

isSubset( _: )

 

- 한 Set이 다른 Set의 부분집합인지 판단하여 boolean 값을 반환

 

let set1: Set<Int> = [1, 2]
let set2: Set<Int> = [1, 2, 3, 4]

let isSubset = set1.isSubset(of: set2) 

print(isSubset)// true

 

부분집합은 한 개씩 멀티 셀렉이 필요한 기능에 유용하게 사용할 수 있을 것이다.

 

예를들어 유저가 선택한 요소들을 A:Set 으로 하나 설정해주고, 선택가능한 모든 요소들을 B:Set으로 설정하여

 

A:Set 가 B:Set 의 부분집합인지 판단한다면, 선택가능한 모든 요소들에서 현재 선택된 요소들 간의 비교를 쉽게 할 수 있다. 

'iOS > Swift' 카테고리의 다른 글

[Swift] lazy property  (0) 2023.06.19
[Swift] Function 의 In-Out parameter  (1) 2023.06.04
[Swift] Array Method (초기화, 추가, 삭제)  (0) 2023.05.30