トップ
正式版

重複組合せの最小完全ハッシュ関数とその逆変換(列挙)の簡略版

概要

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

例えぱ、0 1 2 のように 3 種類(N=3,N>0)の要素があるものとし、 これから 3 つ要素(R=3,R>0)を取り出す場合を考える。
ただし、同じ要素を複数個取り出してもよいとする。
取り出し方は、10 通りあって、辞書順での番号と組合せを列挙すると、

0:(0,0,0)  1:(0,0,1)  2:(0,0,2)  3:(0,1,1)  4:(0,1,2)
5:(0,2,2)  6:(1,1,1)  7:(1,1,2)  8:(1,2,2)  9:(2,2,2)

となる。ここでは(0,1,2)と(2,1,0)を同じものと考える。目的は、

テーブルを作成し何通りあるかを求める InitRepe( )
昇順とは限らない取り出し方の番号を求めるRepeToNum( )
昇順の取り出し方に辞書順の番号を求める RepeToNumFast( )
逆に辞書順の番号から取り出し方を求める NumToRepe( )

応用例

簡略版プログラム

プログラムの結果

   0 -> (0,0,0) ->   0
   1 -> (0,0,1) ->   1
   2 -> (0,0,2) ->   2
   3 -> (0,1,1) ->   3
   4 -> (0,1,2) ->   4
   5 -> (0,2,2) ->   5
   6 -> (1,1,1) ->   6
   7 -> (1,1,2) ->   7
   8 -> (1,2,2) ->   8
   9 -> (2,2,2) ->   9