줄리아에서 컬렉션의 중복을 없애는 법
개요
줄리아에서 컬렉션의 중복을 없애고 체크하는 법을 소개한다. 중복을 없애주는 unique()
함수는 게 알고리즘적으로 봤을 때 전혀 어려울 게 없지만 막상 직접 구현하려면 귀찮고, 효율적이지 않을 수도 있다. 중복 원소가 없는지 체크하는 allunique()
함수는 구현조차 간단한만큼 찾아볼 일이 없는 함수라서 이 기회에 꼭 알아두는 게 좋다.
코드
unique()
julia> x = [3, 1, 4, 1, 5, 9, 2, 6, 5];
julia> y = unique(x)
7-element Vector{Int64}:
3
1
4
5
9
2
6
allunique()
1
사실 이 포스트는 allunique()
를 소개하는 것이 목적이다. 컬렉션이 중복 원소를 가지는지 체크하는 상식적인 방법 중 하나는 length(unique(x)) == length(x)
와 같이 unique()
를 취해서 원소가 줄어들었는지를 체크하는 것이다.
이 방법이 너무 쉽다보니 효율성에 대해 자만하기 쉬운데, 일단 unique()
함수는 길이 $n$인 배열을 적어도 한 번은 모든 원소를 살펴봐야해서 시간복잡도가 $O (n)$ 이다. 이는 코드에서 원소의 중복체크를 자주 할 때 분명히 부담이 될 수 있는 수준의 비용이며, allunique()
는 배열의 길이에 따라 구현도 다르고 중간에 중복 원소가 발견되면 계산을 중단하고 체크에 성공할 수 있는 등 성능적인 부분에서 분명한 이점이 있다.
julia> allunique(x)
false
julia> allunique(y)
true
전체코드
x = [3, 1, 4, 1, 5, 9, 2, 6, 5];
y = unique(x)
allunique(x)
allunique(y)
환경
- OS: Windows
- julia: v1.9.0