Was ist eine kompakte Art, eine Partition einer Menge darzustellen?

11

Es gibt effiziente Datenstrukturen zur Darstellung festgelegter Partitionen. Diese Datenstrukturen weisen eine gute zeitliche Komplexität für Operationen wie Union und Find auf, sind jedoch nicht besonders platzsparend.

Was ist eine platzsparende Möglichkeit, eine Partition einer Menge darzustellen?

Hier ist ein möglicher Ausgangspunkt:

Ich weiß , dass die Anzahl der Partitionen eines Satzes mit Elementen ist , die - ten Bell - Nummer . Die optimale Raumkomplexität für die Darstellung einer Partition einer Menge mit Elementen beträgt also Bits. Um eine solche Darstellung zu finden, könnten wir nach einer Eins-zu-Eins-Zuordnung zwischen (der Menge von Partitionen einer Menge von Elementen) und (der Menge von ganzen Zahlen von bis ) .B N N N log 2 ( B N ) N 1 B N.NBNNNlog2(BN)N1BN

Gibt es eine solche Zuordnung, die effizient zu berechnen ist? Was ich unter "effizient" verstehe, ist, dass ich diese kompakte Darstellung in eine einfach zu manipulierende Darstellung (z. B. eine Liste von Listen) im in oder .log 2 ( B N )Nlog2(BN)

Cberzan
quelle
Sie fragen sich, wie weit von der naiven / natürlichen Codierung entfernt sein könnte, jedem Element der Menge, in dem die Ganzzahl die Partition # darstellt, nur eindeutige Ganzzahlen ? Vielleicht ist es "nicht so viel Unterschied" ...log2(BN)
vzn

Antworten:

7

Sie können die folgende Wiederholungsformel verwenden, um Ihre Codierung zu ermitteln: Dies wird bewiesen, indem berücksichtigt wird, wie viele andere Elemente sich in dem Teil befinden, der das Element . Wenn es davon gibt, haben wir Auswahlmöglichkeiten für sie und Auswahlmöglichkeiten für die Partitionierung des Restes.

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

Auf diese Weise können wir einen rekursiven Algorithmus angeben, um eine beliebige Partition von in eine Zahl im Bereich umzuwandeln . Ich gehe davon aus, dass Sie bereits eine Möglichkeit haben, eine Teilmenge der Größe von in eine Zahl im Bereich (einen solchen Algorithmus) zu konvertieren kann auf die gleiche Weise mit Pascals Wiederholung entwickelt werden ).n+10,,Bn+11k{1,,n}0,,(nk)1(nk)=(n1k)+(n1k1)

Angenommen, der Teil, der enthält, enthält andere Elemente. Finden Sie ihren Code . Berechnen Sie eine Partition von indem Sie alle verbleibenden Elemente auf diesen Bereich "komprimieren". Berechnen Sie rekursiv den Code . Der neue Code lautetn+1kC1{1,,nk}C2

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

In der anderen Richtung finden Sie bei gegebenem Code das eindeutige so, dass und definiere Da , kann es als , wobei . Jetzt codiert die Elemente in dem Teil, der , und codiert eine Partition vonCk

l=0nk1(nl)BlC<l=0nk(nl)Bl,
C=Cl=0nk1(nl)Bl.
0C<(nk)BnkC1Bnk+C20C2<BnkC1n+1C2{1,,nk}, die rekursiv dekodiert werden kann. Um die Dekodierung abzuschließen, müssen Sie die letztere Partition "dekomprimieren", damit sie alle Elemente enthält, die nicht in dem Teil enthalten sind, der .n+1


Hier erfahren Sie, wie Sie mit derselben Technik eine Teilmenge von der Größe rekursiv codieren . Wenn ist der Code , also sei . Wenn dann sei ein Code von als Teilmenge der Größe von ; der Code von ist . Wenn dann sei ein Code von als Teilmenge der Größe von ; der Code vonS{1,,n}kk=00k>0nSC1S{n}k1{1,,n1}SC1nSC1Sk{1,,n1}Sist .C1+(n1k1)

Um einen Code zu dekodieren , gibt es zwei Fälle. Wenn dann decodiere eine Teilmenge von der Größe deren Code , und gebe . Andernfalls decodieren Sie eine Teilmenge von der Größe deren Code , und geben Sie .CC<(n1k1)S{1,,n1}k1CS{n}S{1,,n1}kC(n1k1)S

Yuval Filmus
quelle
Ausgezeichnete Antwort; Danke. Kleiner Fehler: In der Beweisskizze für die Wiederholungsformel oben meine ich, Sie meinen "es gibt von diesen" anstelle von "es gibt von diesen" - dann können die verbleibenden Elemente auf Arten aufgeteilt werden . nkkkBk
Cberzan