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+1n−k(nn−k)=(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+1−1k{1,…,n}0,…,(nk)−1(nk)=(n−1k)+(n−1k−1)
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,…,n−k}C2C=∑l=0n−k−1(nl)Bl+C1Bn−k+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=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}, 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>0n∈SC1S∖{n}k−1{1,…,n−1}SC1n∉SC1Sk{1,…,n−1}Sist .C1+(n−1k−1)
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<(n−1k−1)S′{1,…,n−1}k−1CS′∪{n}S′{1,…,n−1}kC−(n−1k−1)S′