Ein Affix-Code ist ein Code, der gleichzeitig Präfix- und Suffix-Code ist. Das heißt, kein Codewort ist weder das Präfix noch das Suffix eines anderen Codeworts. Affix-Codes können sofort in beide Richtungen (vorwärts und rückwärts) dekodiert werden .
Ich möchte eine erstellen, die eine bestimmte Verteilung der Eingabesymbole bei einer Reihe von Ausgabesymbolen optimal komprimiert.
Der Huffman-Algorithmus (der Präfixcodes erstellt) kommt dem am nächsten, scheint jedoch aufgrund seiner gierigen Strategie für eine Änderung dieses Zwecks ungeeignet zu sein.
Wie können optimale Affix-Codes gefunden werden?
FWIW, es scheint mir wahrscheinlich, dass es ein PTAS für das Problem gibt, das der Grundidee in diesem Artikel folgt . (Dies beantwortet Ihre Frage nicht genau, aber ich werde das PTAS hier im Antwortbereich trotzdem beschreiben, da es zu lang ist, um in einen Kommentar zu passen.)
Fixiere jede Konstante . Sei p eine Instanz des Problems, dh eine Wahrscheinlichkeitsverteilung auf [ n ] .ϵ>0 p [ n ]
Angenommen , ein Code (eine Reihe von Codewörtern) ist fix-frei,K. wenn kein Codewort im Code mit der Länge oder wenigerK. ein Präfix oder Suffix eines anderen Codeworts ist.
Fix . Berechnen Sie einen K- Fix-freien Code mit minimalen Kosten für p im Zeitpolynom in n wie folgt. Betrachten Sie für jede der (konstant vielen) Teilmengen S von Zeichenfolgen mit einer Länge von höchstens K den K- fixfreien Code C ( S ) , der durch Zuweisen von | gebildet wird S | größte Wahrscheinlichkeiten in p , Codewörter von S (Übereinstimmung kleinerer Codewörter mit größeren Wahrscheinlichkeiten), dann Aufzählung (in der Reihenfolge zunehmender Länge) der nK.= ⌈ 1 / ϵ2⌉ K. p n S. K. K. C.( S.) | S.| p S. Zeichenfolgen mit einer Länge größer als K , die kein Präfix oder Suffix in S haben , und Zuweisen dieser n - | S | Zeichenfolgen als Codewörter für die verbleibenden n - | S | Wahrscheinlichkeiten (in der Reihenfolge abnehmender Wahrscheinlichkeit). Jede Teilmenge S gibt einen Code C ( S ) ; Nehmen Sie C 0 als einen der minimalen Kosten (indem Sie alle Auswahlmöglichkeiten für S auflisten). C 0 ist ein kostengünstiger K- fix-freier Code für pn - | S.| K. S. n - | S.| n - | S.| S. C.( S.) C.0 S. C.0 K. p .
Es ist zu beachten, dass die Kosten von eine Untergrenze für die Kosten des optimalen fixfreien Codes für p sind , da der optimale fixfreie Code auch ein K istC.0 p K. fixfreien fixfreie fixfreier Code ist.
Konvertieren Sie anschließend in einen fixfreien Code, ohne die Kosten um mehr als a ( 1 + O ( ϵ ) ) zu erhöhen.C.0 ( 1 + O ( ϵ ) ) wie folgt Faktor .
Fügen Sie innerhalb jedes Codeworts in eine zusätzliche '1' in jede (maximale) Gruppe aufeinanderfolgender '1' mit der Länge K ' = ⌈ 1 / ϵ ⌉ oder mehr ein. (Dies erhöht die Kosten um höchstens einen ( 1 + ϵ ) Faktor, und der resultierende Code ist immer noch K- fix-frei, und keine maximale Gruppe aufeinanderfolgender Einsen in einem Codewort hat die Länge K. ) Dann gilt für jedes Codewort in C 0 mit einer Länge von mehr als K , K ' ' 1 gefolgt von einer '0' voranstellen und K anhängenC.0 K.'= ⌈ 1 / ϵ ⌉ ( 1 + ϵ ) K. K. C.0 K. K.' K.' Vor '1' steht eine '0'. (Diese Änderung markiert eindeutig den Anfang und das Ende jedes Codeworts, wodurch der Code vollständig fixfrei ist. Die Modifikation erhöht die Kosten insgesamt um höchstens einen -Faktor.) Nehmen Sie den resultierenden fixfreien Code C 1 als die Lösung.1 + O ( ϵ ) C.1
Da höchstens ( 1 + O ( ϵ ) ) mal C 0 kostet und die Kosten von C 0 eine Untergrenze für die Kosten des optimalen fixfreien Codes sind, hat der fixfreie Code C 1 höchstens Kosten ( 1 + O ( ϵ ) ) mal die Kosten des optimalen fixfreien Codes.C.1 ( 1 + O ( ϵ ) ) C.0 C.0 C.1 ( 1 + O ( ϵ ) )
quelle