Вы можете использовать способ получения формулы кодирования ниже, чтобы найти кодировку:
Это доказывается с учетом количества других элементов в детали, содержащей элемент . Если их , то у нас есть для них и для разделения остальных.Bn+1=∑k=0n(nk)Bk.
n+1n−k(nn−k)=(nk)Bk
Используя это, мы можем дать рекурсивный алгоритм для преобразования любого раздела в число в диапазоне . Я предполагаю, что у вас уже есть способ преобразования подмножества размера из в число в диапазоне (такой алгоритм может быть разработан таким же образом, используя повторение Паскаля ).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′