Який компактний спосіб представити розділ набору?


11

Існують ефективні структури даних для представлення заданих розділів. Ці структури даних мають хороші часові складності для таких операцій, як Union та Find, але вони не є особливо економічними.

Який просторовий спосіб представити розділ набору?

Ось одна з можливих вихідних точок:

Я знаю, що кількість розділів набору з елементами - , - число номера Белла . Таким чином, оптимальна складність простору для подання розділу множини з елементів - це біт. Щоб знайти таке подання, ми могли б шукати відображення між (безліччю розділів набору з елементів) та (безліччю цілих чисел від до ).NBNNNN 1 B Nlog2(BN)N1BN

Чи існує таке відображення, яке ефективно обчислювати? Що я маю на увазі під "ефективним", це те, що я хочу перетворити це компактне представлення в / з простого для маніпулювання уявлення (наприклад, списку списків) у поліномії часу в або .журнал 2 ( B N )Nlog2(BN)


цікаво, наскільки далеко може бути від наївного / природного кодування просто присвоєння унікальних цілих чисел кожному елементу множини, де ціле число являє собою розділ №? можливо, це "не така велика різниця" ...log2(BN)
vzn

Відповіді:


7

Ви можете скористатись способом, яким виведена нижче формула повторення, щоб знайти ваше кодування: Це доводиться, враховуючи, скільки інших елементів є у частині, що містить елемент . Якщо з них є , то у нас є вибір для них, і вибір для розділення решти.

Bn+1=k=0n(nk)Bk.
n+1nk(nnk)=(nk)Bk

Використовуючи це, ми можемо дати рекурсивний алгоритм для перетворення будь-якого розділу у число в діапазоні . Я вважаю , ви вже є спосіб перетворення підмножина розміру з до числа в діапазоні (такий алгоритм можна створити так само, використовуючи повторення Паскаля ).n+10,,Bn+11k{1,,n}0,,(nk)1(nk)=(n1k)+(n1k1)

Припустимо, що частина, що містить містить інших елементів. Знайдіть їх код . Обчисліть розділ , "стиснувши" всі решта елементів до цього діапазону. Рекурсивно його код . Новий код -n+1kC1{1,,nk}C2

C=l=0nk1(nl)Bl+C1Bnk+C2.

В іншому напрямку, заданому кодом , знайдіть унікальний такий, що і визначимо Оскільки , його можна записати як , де . Тепер кодує елементи в частині, що містить , а кодує розділCk

l=0nk1(nl)BlC<l=0nk(nl)Bl,
C=Cl=0nk1(nl)Bl.
0C<(nk)BnkC1Bnk+C20C2<BnkC1n+1C2{1,,nk}, які можна розшифрувати рекурсивно. Щоб завершити розшифровку, потрібно "розпакувати" останній розділ, щоб він містив весь елемент, який не відображається в частині, що містить .n+1


Ось як використовувати ту ж техніку , щоб кодувати підмножина з розміру , рекурсивно. Якщо то код дорівнює , то припустимо, . Якщо , то нехай бути код , як підмножина розміру з ; код - . Якщо , то нехай бути код , як підмножина розміру з ; кодS{1,,n}kk=00k>0nSC1S{n}k1{1,,n1}SC1nSC1Sk{1,,n1}Sє .C1+(n1k1)

Для розшифровки коду є два випадки. Якщо , то розшифровує підмножина з розміру , код якого є , і вихід . В іншому випадку, декодувати підмножина з розміру якої код , і вихід .CC<(n1k1)S{1,,n1}k1CS{n}S{1,,n1}kC(n1k1)S


Відмінна відповідь; Дякую тобі. Незначна помилка: Під ескізом доказів формули повторення у верхній частині, я думаю, ви маєте на увазі "є тих", а не "є таких" - тоді решта елементів можна розділити способами . nkkkBk
cberzan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.