Vous pouvez utiliser la manière dont la formule de récurrence ci-dessous est dérivée pour trouver votre codage:
Ceci est prouvé en considérant combien d'autres éléments se trouvent dans la partie contenant l'élément . S'il y en a , alors nous avons choix pour eux, et choix pour partitionner le reste.Bn+1=∑k=0n(nk)Bk.
n+1n−k(nn−k)=(nk)Bk
En utilisant cela, nous pouvons donner un algorithme récursif pour convertir n'importe quelle partition de en un nombre dans la plage . Je suppose que vous avez déjà un moyen de convertir un sous-ensemble de taille de en un nombre compris dans la plage (un tel algorithme peut être conçu de la même manière en utilisant la récurrence de Pascal ).n+10,…,Bn+1−1k{1,…,n}0,…,(nk)−1( nk)=(n−1k)+(n−1k−1)
Supposons que la partie contenant contient autres éléments. Trouvez leur code . Calculez une partition de en "compressant" tous les éléments restants dans cette plage. Calculer récursivement son code . Le nouveau code estn+1kC1{1,…,n−k}C2C=∑l=0n−k−1(nl)Bl+C1Bn−k+C2.
Dans l'autre sens, étant donné un code , trouvez l'unique tel que
et définissez
Puisque , il peut être écrit comme , où . Maintenant code les éléments dans la partie contenant , et code une partition deCk∑l=0n−k−1(nl)Bl≤C<∑l=0n−k(nl)Bl,
C′=C−∑l=0n−k−1(nl)Bl.
0≤C′<(nk)Bn−kC1Bn−k+C20≤C2<Bn−kC1n+1C2{1,…,n−k}n+1, qui peut être décodé récursivement. Pour terminer le décodage, vous devez "décompresser" cette dernière partition afin qu'elle contienne tout l'élément n'apparaissant pas dans la partie contenant .n+1
Voici comment utiliser la même technique pour encoder un sous-ensemble de de taille , récursivement. Si alors le code est , supposons donc . Si alors est un code de , comme un sous-ensemble de taille de ; le code de est . Si alors Soit un code de , comme un sous-ensemble de taille de ; le code deS{1,…,n}kk=00k>0n∈SC1S∖{n}k−1{1,…,n−1}SC1n∉SC1Sk{1,…,n−1}Sest .C1+(n−1k−1)
Pour décoder un code , il y a deux cas. Si alors décodez un sous-ensemble de de taille dont le code est , et sortez . Sinon, décodez un sous-ensemble de de taille dont le code est , et sortez .CC<(n−1k−1)S′{1,…,n−1}k−1CS′∪{n}S′{1,…,n−1}kC−(n−1k−1)S′