logo

줄리아의 정렬순열 함수과 그 응용 sortperm 📂줄리아

줄리아의 정렬순열 함수과 그 응용 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