줄리아의 정렬순열 함수과 그 응용 sortperm
코드
sortperm
은 주어진 배열을 정렬이 되도록 하는 인덱스의 배열을 리턴한다1. 말만 보면 어려워 보이지만 예시를 보면 한 번에 이해가 된다.
julia> foo = ['다', '나', '라', '가']
4-element Vector{Char}:
'다': Unicode U+B2E4 (category Lo: Letter, other)
'나': Unicode U+B098 (category Lo: Letter, other)
'라': Unicode U+B77C (category Lo: Letter, other)
'가': Unicode U+AC00 (category Lo: Letter, other)
julia> sortperm(foo)
4-element Vector{Int64}:
4
2
1
3
julia> foo[sortperm(foo)]
4-element Vector{Char}:
'가': Unicode U+AC00 (category Lo: Letter, other)
'나': Unicode U+B098 (category Lo: Letter, other)
'다': Unicode U+B2E4 (category Lo: Letter, other)
'라': Unicode U+B77C (category Lo: Letter, other)
트릭
내장함수까지는 아니지만 sortperm
으로 자주 쓰는 트릭을 소개한다.
ranking
ranking(x) = sortperm(sortperm(x, rev = true))
배열의 랭킹을 리턴한다. 랭킹 함수는 통계 관련 패키지인 StatBase.jl
에도 있기는 하다2. 그러나 sortperm
만으로도 쉽게 구현할 수 있어서 딱 랭킹만 필요한 경우엔 패키지를 로드하지 않고 이렇게 쓰기도 한다.
julia> a = randn(5)
5-element Vector{Float64}:
0.7795283609374186
0.6230493124556412
1.7323736283590032
-2.0790567409341945
-0.05984808360056012
julia> ranking(a)
5-element Vector{Int64}:
2
3
1
5
4
argnth
argnth(n, A) = sortperm(A, rev = true)[n]
n
번째로 큰 원소의 인덱스를 리턴한다. 막상 sortperm
없이 짜보려면 구현하기가 까다롭다.
julia> b = randn(5)
5-element Vector{Float64}:
-0.45523175238444824
0.2671034422090365
-1.0703159524443844
-0.4218688982647255
-0.27806227968448743
julia> argnth(3, b)
4
환경
- OS: Windows
- julia: v1.10.0