Codierung, Codes (variabler Länge) A = {a, b, c,...} eine endliche Menge von Nachrichten (Quellalphabet) B = {0, 1} das Kanalalphabet Eine (binäre) Codierung ist eine injektive Abbildung Φ : A B +, falls die Fortsetzung zu einem Homomorphismus Φ : A B : a 1 a 2... a n Φ(a 1 )Φ(a 2 )... Φ(a n ) ebenfalls injektiv ist, d.h. (UD) für jedes w B gibt es höchstens ein a A mit Φ(a) = w (Decodierbedingung, unique decipherability) Die Menge Φ(A) = {Φ(a), Φ(b), Φ(c),...} der Codewörter wird dann als Code bezeichnet
Beispiele a 00 b 01 Φ 1 : c 10 d 11 a 0 b 111 Φ 2 : c 110 d 101 a 01 b 011 Φ 3 : c 110 d 101 Φ 1 ist Codierung mit konstanter Länge ( Blockcode ) Φ 1 (abadc) = 00 01 00 11 10 = 0001001110 Φ 2 ist Codierung mit variabler Länge Φ 2 (abadc) = 0 111 0 101 110 = 01110101110 Φ 3 ist keine Codierung! Φ 3 (bda) = 011 101 01 = 01110101 = 01 110 101 = Φ 3 (acd)
Präfixeigenschaft (PP) Eine Codierung Φ (ein Code Φ(A)) hat die Präfix-Eigenschaft (oder: ist ein Präfixcode), wenn gilt: (PP) Kein Codewort ist Präfix eines anderen Codewortes Φ 1 (und allgemein alle Codes konstanter Länge) sowie Φ 2 haben die (PP), für die Abbildung Φ 3 gilt (PP) nicht. Offensichtlich: (PP) (UD), aber (UD) (PP). Zwei Beispiele mit A = {a, b, c, d, e}: a 0 a 00 b 100 Φ 4 : c 1010 d 1011 e 11 b 101 Φ 5 : c 010 d 001 e 11 Φ 4 hat (PP), Φ 5 hat (UD), aber nicht (PP).
Präfixcodes und binäre Bäume Präfixcodes sind binäre Bäume in einem erweiterten Sinn: innere Knoten können einen (rechten oder linken) oder zwei (rechten und linken) Nachfolger haben. d c b a 1 0 1 0 1 0 Φ 1 a b c d 1 0 1 0 1 0 1 Φ 2 a e b c d 1 1 0 0 1 0 0 1 Φ 4
Vergleich von Codierungen Vergleiche die Codierungen Φ 4 und Φ 5 : Φ 4 Φ 5 aaaea 000110 0000001100 abaedbc 0100011101110101011 0010001100101010 Welche Codierung besser? Das hängt davon ab, mit welchen Wahrscheinlichkeiten die Quellsymbole a, b, c, d, e vorkommen!
Quellen Eine Quelle Q = A, p ist ein Paar, bestehend aus einem Quellalphabet A = {a, b, c,...} einer Wahrscheinlichkeitsverteilung p = (pa, p b, p c,...) auf A. Für Codierungen Φ : A {0, 1} + einer Quelle Q = A, p ist µ(q, Φ) = x A p x Φ(x) mittlere oder erwartete Codewortlänge des Codes C = Φ(A)
Mittlere Codewortlänge und Höhe von Binärbäumen Für Präfixcodes gilt: mittlere Codewortlänge gewichtete mittlere Höhe des entsprechenden Binärbaumes (im erweiterten Sinn) Diese Größe ist ein Maß dafür, welche Kompression bei Codierung mit diesem Code erreicht wird
Beispiel Q = A, p mit A = {a, b, c, d} und p = (p a, p b, p c, p d ) = (0.9, 0.05, 0.025, 0.025) Φ 1 : a 00, b 01, c 10, d 11 µ(q, Φ 1 ) = 0.9 2 + 0.05 2 + 0.025 2 + 0.025 2 = 2 Φ2 : a 0, b 111, c 110, d 101 µ(q, Φ 2 ) = 0.9 1 + 0.05 3 + 0.025 3 + 0.025 3 = 1.2
Beispiel Q = A, q mit A = {a, b, c, d} und q = (q a, q b, q c, q d ) = (0.35, 0.25, 0.25, 0.15) Φ 1 : a 00, b 01, c 10, d 11 µ(q, Φ 1 ) = 0.35 2 + 0.25 2 + 0.25 2 + 0.15 2 = 2 Φ2 : a 0, b 111, c 110, d 101 µ(q, Φ 2 ) = 0.35 1 + 0.25 3 + 0.25 3 + 0.15 3 = 2.3
Shannons Erkenntnis Bei gegebener Quellverteilung p = (p a, p b, p c,...) ist die Entropie H(p) ein Maß dafür, welche Kompression (mittlere gewichtete Wortlänge) durch geeignete Codierung (annähernd) erreicht werden, aber bei keiner Codierung unterschritten werden kann
Wichtige Anmerkungen Für optimale Codierung kann man sich auf die Verwendung von (echten) Binärbäumen beschränken Präfixcodes lassen sich online decodieren, bei Codes ohne (PP) geht das i.a. nicht Verwendung von (UD)-Codes, die nicht die (PP) haben, kann die Situation bezüglich Kompression nicht verbessern, denn es gilt der Satz von Macmillan: Zu jeder Quelle Q = A, p und zu jedem (UD)-Code Φ(A) gibt es einen (PP)-Code Ψ(A) mit µ(q, Φ) = µ(q, Ψ) Die Konstruktion optimaler Präfixcodes leistet ein Verfahren von Huffman
Existenz von Präfixcodes: Ungleichung von Kraft Notwendig und hinreichend für die Existenz eines binären Präfixcodes {w 1, w 2,..., w n } B mit Wortlängen w k = l k (1 k n) ist 1 k n 2 l k 1 Beachte: ist t ein Binärbaum (im ursprünglichen Sinn), so gilt immer 2 h(b,t) = 1 b E(t)
Beweis der Ungleichung von Kraft Die Bedingung ist notwendig, denn existiert ein solcher Präfixcode und ist l n = max 1 k n l k, so gilt die Wortmengen w k B ln l k B ln (1 k n) wegen (PP) paarweise disjunkt und daher 2 ln l k 2 ln 1 k n
Beweis der Ungleichung von Kraft Die Bedingung ist hinreichend (mittels Induktion über n): Für n = 1 bzw. n = 2 leisten {0 l1 } bzw. {0 l1, 1 l2 } das Gewünschte Sei die Behauptung für n > 1 bewiesen und genügen die 1 l 1... l n l n+1 der Ungleichung von Kraft. Dann gilt die Ungleichung von Kraft auch für die n + 1 Zahlen l 1, l 2,..., l n 1, l n, l n und wegen 2 ln + 2 ln = 2 (ln 1) auch für die n Zahlen Es existiert also ein Präfixcode l 1, l 2,..., l n 1, l n 1. {w 1, w 2,..., w n } mit w k = l k (1 k < n) und w n = l n 1. Der Präfixcode leistet das Verlangte {w 1, w 2,..., w n 1, w n 0, w n 1 ln+1 ln+1 }
Beispiel zur Ungleichung von Kraft Wortlängen Code 2, 3, 3, 3, 5, 7 {00, 010, 110, 111, 01110, 0111111} 2, 3, 3, 3, 4 {00, 010, 110, 111, 0111} 2, 2, 3, 3 {00, 01, 110, 111} 2, 2, 2 {00, 01, 11} 1, 2 {0, 11} 0 {ɛ}
Shannons Quellcodierungstheorem: die obere Schranke Q = A, p Quelle mit Alphabet A = {a 1,..., a n } und Wkeiten p = (p 1, p 2,..., p n ) (o.e. p k > 0 (1 k n)) aus l k = log p k (1 k n) folgt log p k l k < 1 log p k (1 k n) und somit aus der linken Ungleichung 2 l k 1 1 k n aus Kraft es existiert ein Präfixcode Φ : A {w 1, w 2,..., w n } : a i w i (1 i n) mit den Wortlängen w k = l k = 2 log p k (1 k n) Abschätzung für die mittlere Wortlänge dieses Codes aus der rechten Ungleichung µ(q, Φ) = p k l k < p k (1 log p k ) = 1 + H(p) 1 k n 1 k n
Optimale Codierungen Eine optimale Codierung Φ für eine Quelle Q = A, p liegt vor, wenn µ(q, Φ) = min{ µ(q, Ψ) ; Ψ Codierung für Q } Das Theorem von Shannon garantiert für optimales Φ H(p) µ(q, Φ) < 1 + H(p) Die Konstruktion eines optimalen Φ kann mit Hilfe eines greedy -Algorithmus ausgeführt werden, der sich am Beweis der Ungleichung von Kraft orientiert
Eigenschaften optimaler Codierungen Ist Q = A, p ein Quelle mit A 2 und Φ eine optimale Codierung für Q, so gilt: Für a, b A mit p a > p b ist Φ(a) Φ(b) Begründung Gibt es a, b A mit pa > p b und Φ(a) > Φ(b), so kann man die Codierungen von a und b vertauschen: a Φ(b) Ψ : b Φ(a) c Φ(c) (c A \ {a, b}) und damit die mittlere Codewortlänge verkleinern: µ(q, Ψ) = µ(q, Φ) p a ( Φ(a) Ψ(a) ) p b ( Φ(b) Ψ(b) ) = µ(q, Φ) (p a p b ) ( Φ(a) Φ(b) ) } {{ } >0
Eigenschaften optimaler Codierungen Ist Φ optimale Codierung für Q, so kann man annehmen (d.h., durch Umordnung erreichen), dass es Symbole a, b A mit minimalen Wahrscheinlichkeiten p a, p b gibt, d.h. p a, p b min p c, c A\{a,b} die als Geschwister codiert sind, d.h. es gibt ein w {0, 1} mit Φ(a) = w 0 und Φ(b) = w 1 Begründung Knoten auf dem höchsten Niveau eines Binärbaumes (im engeren Sinne) treten immer als Geschwisterpaare auf Durch Umordung der Wahrscheinlichkeiten auf dem höchsten Niveau kann man die angegebene Situation erreichen, ohne die mittlere Wortlänge zu ändern
Fusion einer Quelle Q = A, p Quelle mit A 2 a, b A zwei Quellsymbole die durch Fusion der Quellsymbolen A und b entstehende Quelle Q = A, p wird definiert durch: Q = A, p A = \ {a, b}) {α} (A { p x = p x für x A \ {a, b} p a + p b für x = α
Fusion und optimale Codes Φ (strikter) Präfixcode für Q Φ(a) und Φ(b) Geschwister, d.h. Φ(a) = w 0, Φ(b) = w 1 für ein w {0, 1} Φ definiert durch Φ : A {0, 1} + : { x Φ(x) α w, für x A \ {a, b}, Φ ein (strikter) Präfixcode für Q
Fusion und optimale Codes Φ ein (strikter) Präfixcode für Q Φ definiert durch x Φ (x) Φ : A {0, 1} + : a Φ (α) 0, b Φ (α) 1, für x A \ {a, b}, Φ ein (strikter) Präfixcode für Q, bei dem Φ(a) und Φ(b) Geschwister sind
Fusion und optimale Codes Für die mittleren Codewortlängen gilt dabei µ(q, Φ) µ(q, Φ ) = p a Φ(a) + p b Φ(b) p α Φ (α) = p a Φ(a) + p b Φ(b) (p a + p b ) ( Φ(a) 1) = p a + p b = p α.
Fusion und optimale Codes Entsteht die Quelle Q = A, p aus der Quelle Q = A, p durch Fusion zweier Symbole a, b A mit minimalen Wahrscheinlichkeiten p a, p b, so gilt (mit dem obigen Zusammenhang zwischen Φ und Φ ): Φ optimal für Q Φ optimal für Q Diese Aussage erlaubt die rekursive Konstruktion optimaler Präfixcodes
Schema der Huffman-Konstruktion Dabei ist Q (2) Q (3) Q (n 1) Q (n) = Q Φ (2) Φ (3) Φ (n 1) Φ (n) = Φ Q (k) : Quelle mit k Symbolen Φ (k) : optimaler Präfixcode für Q (k) Q (k 1) Q (k) : Fusion von zwei Symbolen mit minimaler Wahrscheinlichkeit Φ (k 1) Φ (k) : Konstruktion entlang Umkehrung der Fusion Q (2) = {a, b}, (p a, p b ) Φ (2) = a 0, b 1
Huffman-Konstruktion (mit Symbolhäufigkeiten statt Wkeiten) Q (4) Q (5) Q (6) a 9 10 b 8 11 cdf 10 01 e 15 00 Q (3) Φ (4) ab 17 1 cdf 10 01 e 15 00 Φ (5) a 9 10 b 8 11 c 5 010 df 5 011 e 15 00 Q (2) Φ (3) Φ (2) ab 17 1 cdef 25 0 Φ (6) a 9 10 b 8 11 c 5 010 d 3 0110 e 15 00 f 2 0111 Beachte: µ(q (6), Φ (6) ) = 9 2 + 8 2 + 5 3 + 3 4 + 15 2 + 2 4 42 5 + 10 + 17 + 25 = + 1 = 99 42 42 = 2.35714284... H( 9 42, 8 42, 5 42, 3 42, 15 42, 2 42 ) = 2.309050472...
bottom-up-konstruktion Quelle Q = A, p mit A = n mit p = (p 1,..., p n ) Man konstruiert eine Folge F (n), F (n 1),..., F (3), F (2), F (1), wobei jedes F (k) = { (t (k) 1, g 1),..., (t (k) k, g k ) } ein Wald von k gewichteten Binärbäumen ist Dabei ist g 1 g 2... g k und g 1 + + g k = 1. Das Gewicht eines gewichteten Binärbaumes ist die Summe der Gewichte seiner Blätter unter der Bewertung
Die Konstruktion startet mit F (n) = {(, p 1 ),..., (, p n )} Der Konstruktionsschritt F (k) F (k 1) fusioniert die beiden Bäume aus F (k) mit dem geringsten Gewicht: ( F (k 1) = F (k) \ { (t (k) k 1, g k 1), (t (k) k, g k ) }) (s, h) wobei s =, t (k) k 1, t(k) k, h = g k 1 + g k Die Bäume in F (k 1) sind noch nach ihrem Gewicht zu ordnen F (1) = {t (1) 1 } ist ein Baum und dies ist der Huffman-Code
Beispiel e / 15 a / 9 b / 8 c / 5 d / 3 f / 2 25 17 e / 15 10 a / 9 b / 8 e / 15 a / 9 b / 8 c / 5 5 c / 5 5 d / 3 f / 2 d / 3 f / 2 e / 15 10 a / 9 b / 8 42 c / 5 5 25 17 d / 3 f / 2 e / 15 10 a / 9 b / 8 e / 15 17 10 c / 5 5 a / 9 b / 8 c / 5 5 d / 3 f / 2 d / 3 f / 2
Komplexität der Huffman-Konstruktion Die Information über die Baum-Gewichte g j kann man in einer priority queue organisieren! Diese Queue kann man als minimum-heap implementieren Der Aufbau des heaps kostet O(n) Aufwand Die n 1 Konstruktionsschritte erfordern heap-operationen (2 deletemin, 1 reheap) mit einem Aufwand von jeweils O(log n) Der Gesamtaufwand (an Vergleichsoperationen) ist somit O(n log n)
Einige weiterführende Bemerkungen Huffmans Konstruktion ist ein klassischer greedy-algorithmus Weitere bekannte greedy-algorithmen Zahldarstellung in Positionssystemen Minimale Gerüste (Spannbäume) (Kruskal, Prim) Kürzeste Wege (Dijkstra) Knapsack ( fractional ) greedy gehört mit divide-and-conquer, dynamic programming, backtracking mit branch-and-bound, randomization zu den fundamentalen algorithmischen Prinzipien Typische für greedy: optimale Lösungen von Teilproblemen lassen sich immer zu global-optimalen Lösungen fortsetzen greedy kann man nicht immer einsetzen, aber wenn ja, ist es sehr effizient! Man kann genau charakterisieren, in welchen Situationen greedy funktioniert (das führt auf den Begriff der Matriode ).