以下の漸化式を導き出す方法を使用して、エンコーディングを見つけることができます:
Bn + 1= ∑k = 0ん( nk) Bk。
これは、要素n + 1を含む部分に他の要素がいくつあるかを検討することによって証明されます。ある場合n − kこれらの、そして我々は持っている( nn − k) =( nk)それらの選択肢、および残りを分割するためのBk選択肢。
これを使用して、n + 1パーティションを0 、… 、Bn + 1− 1の範囲の数値に変換する再帰的アルゴリズムを提供できます。私はあなたが既にサイズのサブセット変換の方法があるとしkの{ 1 、… 、n }の範囲内の数値に0 、… 、( nk) −1(このようなアルゴリズムは、Pascalの再帰( nk) =( n−1k) +( n−1k − 1))。
n + 1含む部分にk他の要素が含まれているとします。コードC1を見つけます。残りのすべての要素をその範囲に「圧縮」して、{ 1 、… 、n − k }パーティションを計算します。そのコードC2再帰的に計算します。新しいコードはC= ∑l = 0n − k − 1( nl) Bl+ C1Bn − k+ C2。
他の方向では、コードの所与C、ユニーク見つけるkように
Σl = 0n − k − 1( nl) Bl≤ C< ∑l = 0n − k( nl) Bl、
および定義
C』= C− ∑l = 0n − k − 1( nl) Bl。
以降0 ≤ C』< ( nk) Bn − k、それはのように書くことができるC1Bn − k+ C2、0 ≤ C2< Bn − k。今C1コードを含む部分の要素n + 1、およびC2コードのパーティション{ 1 、… 、n − k }、再帰的にデコードできます。デコードを完了するには、後者のパーティションを「解凍」して、n + 1を含む部分に表示されないすべての要素が含まれるようにする必要があります。
同じ方法を使用して、サイズkの{ 1 、… 、n }のサブセットSを再帰的にエンコードする方法を次に示します。場合K = 0は、コードは0、そう仮定するK > 0。もしN ∈ Sは次いでせてC 1のコードでS ∖ { N }サイズのサブセットとして、K - 1の{ 1 、... 、N - 1 }{ 1 、… 、n }kk = 00k>0n∈SC1S∖{n}k−1{1,…,n−1}; SのコードはC1です。もしn∉S次いでせてC1のコードでSサイズのサブセットとして、kの{1,…,n−1}。SのコードはC1+(n−1k−1)。
コードCをデコードするには、2つのケースがあります。もしC<(n−1k−1)、次いでデコードA部分集合S′の{1,…,n−1}サイズのk−1コードであるC、及び出力S′∪{n}。そうでなければ、デコードA部分集合S′の{1,…,n−1}サイズのkコードであるC−(n−1k−1)、および出力S′。