Puede utilizar la forma en que se deriva la siguiente fórmula de recurrencia para encontrar su codificación:
Esto se prueba considerando cuántos otros elementos hay en la parte que contiene el elemento . Si hay de estos, entonces tenemos opciones para ellos, y opciones para dividir el resto.Bn+1=∑k=0n(nk)Bk.
n+1n−k(nn−k)=(nk)Bk
Con esto, podemos dar un algoritmo recursivo para convertir cualquier partición de en un número en el rango . Supongo que ya tiene una forma de convertir un subconjunto de tamaño de a un número en el rango (tal algoritmo puede idearse de la misma manera usando la recurrencia de Pascal ).n+10,…,Bn+1−1k{1,…,n}0,…,(nk)−1(nk)=(n−1k)+(n−1k−1)
Suponga que la parte que contiene contiene otros elementos. Encuentra su código . Calcule una partición de "comprimiendo" todos los elementos restantes en ese rango. Calcular recursivamente su código . El nuevo código esn+1kC1{1,…,n−k}C2C=∑l=0n−k−1(nl)Bl+C1Bn−k+C2.
En la otra dirección, dado un código , encuentre la única tal que
y defina
Como , puede escribirse como , donde . Ahora codifica los elementos en la parte que contiene , y codifica una partición 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}, que se puede decodificar recursivamente. Para completar la decodificación, debe "descomprimir" la última partición para que contenga todo el elemento que no aparece en la parte que contiene .n+1
Aquí se explica cómo usar la misma técnica para codificar un subconjunto de de tamaño , recursivamente. Si entonces el código es , entonces supongamos que . Si entonces sea un código de , como un subconjunto de tamaño de ; El código de es . Si entonces deje que sea un código de , como un subconjunto de tamaño de ; el código deS{1,…,n}kk=00k>0n∈SC1S∖{n}k−1{1,…,n−1}SC1n∉SC1Sk{1,…,n−1}Ses .C1+(n−1k−1)
Para decodificar un código , hay dos casos. Si entonces decodifica un subconjunto de de tamaño cuyo código es y la salida . De lo contrario, decodifique un subconjunto de de tamaño cuyo código sea , y envíe .CC<(n−1k−1)S′{1,…,n−1}k−1CS′∪{n}S′{1,…,n−1}kC−(n−1k−1)S′