您可以使用以下递归公式的派生方式来找到您的编码:
通过考虑在包含元素的部分中还有多少其他元素来证明这一点。如果有个,那么我们有选择,还有用于划分其余部分的选择。Bn+1=∑k=0n(nk)Bk.
n+1n−k(nn−k)=(nk)Bk
使用此方法,我们可以提供一种递归算法,将任何分区转换为范围内的数字。我假设您已经有一种方法可以将的大小为的子集转换为范围内的数字(这种算法可以使用Pascal的递归来以相同的方式设计。n+10,…,Bn+1−1k{1,…,n}0,…,(nk)−1(nk)=(n−1k)+(n−1k−1)
假设包含的部分包含其他元素。找到他们的代码。通过将所有其余元素“压缩”到该范围计算的分区。递归计算其代码。新代码为n+1kC1{1,…,n−k}C2C=∑l=0n−k−1(nl)Bl+C1Bn−k+C2.
在另一个方向上,给定代码,找到唯一的,使得
并定义
由于,因此可以写成,其中。现在编码包含的部分中的元素,而编码的分区Ck∑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
这是如何使用相同的技术递归编码大小为的的子集的方法。如果则代码为,因此假设。如果则令为,作为的大小的子集;的代码为。如果则令为的代码,作为的大小的子集;的代码S{1,…,n}kk=00k>0n∈SC1S∖{n}k−1{1,…,n−1}SC1n∉SC1Sk{1,…,n−1}S是。C1+(n−1k−1)
为了解码代码,有两种情况。如果则解码大小为的的子集,其代码为,并输出。否则,解码大小为的的子集,其代码为,然后输出。CC<(n−1k−1)S′{1,…,n−1}k−1CS′∪{n}S′{1,…,n−1}kC−(n−1k−1)S′