LoginSignup
0
0

More than 5 years have passed since last update.

辞書順でn番目にあたる順列を求める

Last updated at Posted at 2015-01-24

やること

配列["A", "B", "C"]が与えられたとする。その全ての順列を辞書順に並べると
["A", "B", "C"]
["A", "C", "B"]
["B", "A", "C"]
["B", "C", "A"]
["C", "A", "B"]
["C", "B", "A"]
となる。["A", "B", "C"]が1番目、["C", "B", "A"]が6番目というように番号をふることにする。
n番目の順列を返す関数を求める。

考え方

nを階乗進法になおすと簡単に求まることが知られている。省略。後で書く・・・はず

コード


function factoradic(num::Int)
    ret_vec = Int[]
    i = 1
    my_div = 1
    while my_div != 0
        my_div, my_rem = divrem(num, i)
        push!(ret_vec, my_rem)
        num = my_div
        i+=1
    end
    ret_vec
end

function my_rearrange{T}(my_vec::Array{T}, idx_vec::Array{Int})
    ret_vec = T[]
    for i=1:length(my_vec)
        push!(ret_vec, splice!(my_vec, idx_vec[i]))
    end
    return ret_vec
end

function nth_perm(my_vec, n)
    a = factoradic(n-1)
    a = [a, zeros(Int, length(my_vec) - length(a))]
    a.+=1
    return my_rearrange(my_vec, reverse(a))
end

nth_perm(["A", "B", "C", "D", "E", "F", "G"], 5040)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0