ジュリアでコレクションの重複を削除する方法
概要
ジュリアでコレクションの重複をなくし、チェックする方法を紹介する。重複をなくす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