Você pode usar o modo como a fórmula de recorrência abaixo é derivada para localizar sua codificação:
Isso é comprovado considerando-se quantos outros elementos existem na parte que contém o elemento . Se houver destes, então temos para eles e para particionar o restante.Bn+1=∑k=0n(nk)Bk.
n+1n−k( nn - k) = ( nk)Bk
Usando isso, podemos fornecer um algoritmo recursivo para converter qualquer partição de em um número no intervalo . Suponho que você já tenha uma maneira de converter um subconjunto de tamanho de em um número no intervalo (um algoritmo desse tipo pode ser criado da mesma maneira usando a recorrência de Pascal ).n + 10 , ... , Bn + 1- 1k{ 1 , … , n }0 , … , ( nk) -1( nk) = ( n-1k) + ( n-1k - 1)
Suponha que a parte que contém contenha outros elementos. Encontre o código . Calcule uma partição de "compactando" todos os elementos restantes para esse intervalo. recursivamente seu código . O novo código én + 1kC1 1{ 1 , … , n - k }C2C=∑l=0n−k−1(nl)Bl+C1Bn−k+C2.
Na outra direção, dado um código , encontre o único tal que
e defina
Desde , ele pode ser escrito como , onde . Agora codifica os elementos na parte que contém e codifica uma partição 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, que pode ser decodificado recursivamente. Para concluir a decodificação, é necessário "descompactar" a última partição para que ela contenha todo o elemento que não aparece na parte que contém .n+1
Aqui está como usar a mesma técnica para codificar um subconjunto de de tamanho , recursivamente. Se , o código é , então suponha que . Se , deixe ser um código de , como um subconjunto do tamanho de ; o código de é . Se , deixe ser um código de , como um subconjunto de tamanho de ; o código deS{1,…,n}kk=00k>0n∈SC1S∖{n}k−1{1,…,n−1}SC1n∉SC1 1Sk{ 1 , … , n - 1 }Sé .C1 1+ ( n - 1k - 1)
Para decodificar um código , existem dois casos. Se , decodifique um subconjunto de de tamanho cujo código é , e produza . Caso contrário, decodifique um subconjunto de de tamanho cujo código é e faça a saída .CC< ( n - 1k - 1)S′{1,…,n−1}k−1CS′∪{n}S′{1,…,n−1}kC−(n−1k−1)S′