トップ
正式版

順列の最小完全ハッシュ関数とその逆変換(列挙)の簡略版

概要

このC/C++言語で書かれたソースプログラムは、 順列の最小完全ハッシュ関数(辞書順での順位)を求める。
また、最小完全ハッシュ関数の逆変換もできる。
そして0から順に最大値までをこの逆変換をすれば、 順列を全て列挙することができる。

例えぱ、0 1 2 3 のように 4 種類(N=4,N>0)の要素があるものとし、 これから 3 つ要素(R=3,0<R<=N)を取り出して並べる場合を考える。
並べ方は、24 通りあって、辞書順での番号と並べ方を列挙すると、

 0:(0,1,2)   1:(0,1,3)   2:(0,2,1)   3:(0,2,3)   4:(0,3,1)   5:(0,3,2)
 6:(1,0,2)   7:(1,0,3)   8:(1,2,0)   9:(1,2,3)  10:(1,3,0)  11:(1,3,2)
12:(2,0,1)  13:(2,0,3)  14:(2,1,0)  15:(2,1,3)  16:(2,3,0)  17:(2,3,1)
18:(3,0,1)  19:(3,0,2)  20:(3,1,0)  21:(3,1,2)  22:(3,2,0)  23:(3,2,1)

となる。目的は、

テーブルを作成し何通りあるかを求めるInitPerm( )
並べ方の辞書順の番号を求める PermToNum( )
逆に辞書順の番号から並べ方を求める NumToPerm( )

応用例

簡略版プログラム

プログラムの結果

   0 -> (0,1,2) ->   0
   1 -> (0,1,3) ->   1
   2 -> (0,2,1) ->   2
   3 -> (0,2,3) ->   3
   4 -> (0,3,1) ->   4
   5 -> (0,3,2) ->   5
   6 -> (1,0,2) ->   6
   7 -> (1,0,3) ->   7
   8 -> (1,2,0) ->   8
   9 -> (1,2,3) ->   9
  10 -> (1,3,0) ->  10
  11 -> (1,3,2) ->  11
  12 -> (2,0,1) ->  12
  13 -> (2,0,3) ->  13
  14 -> (2,1,0) ->  14
  15 -> (2,1,3) ->  15
  16 -> (2,3,0) ->  16
  17 -> (2,3,1) ->  17
  18 -> (3,0,1) ->  18
  19 -> (3,0,2) ->  19
  20 -> (3,1,0) ->  20
  21 -> (3,1,2) ->  21
  22 -> (3,2,0) ->  22
  23 -> (3,2,1) ->  23