Ви можете скористатись способом, яким виведена нижче формула повторення, щоб знайти ваше кодування:
Це доводиться, враховуючи, скільки інших елементів є у частині, що містить елемент . Якщо з них є , то у нас є вибір для них, і вибір для розділення решти.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′