Skript als PDF Skript
Skript als PDF Skript
Skript als PDF Skript
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
2.7 Der Shannon-Fano-Elias Code<br />
Die Huffman-Codierung ist ein asymptotisch optimales Verfahren. Wir haben<br />
auch gesehen, dass sich die Huffman-Codierung gut berechnen und dann<br />
auch gut decodieren lassen. Die letzte Aussage trifft allerdings nur zu, wenn<br />
das Quellalphabet nicht zu groß ist. Denn zur Berechnung der Codeworte<br />
eines Huffman-Codes wird Zeit O(n log n) benötigt, wenn n die Größe<br />
des Alphabets ist. Da wir die Wahrscheinlichkeiten in der Verteilung (implizit)<br />
sortieren müssen, können wir auch nicht hoffen, die Codeworte in Zeit<br />
weniger <strong>als</strong> n log n zu berechnen. Für die eigentliche Codierung und Decodierung<br />
wird auch der Huffman-Baum benötigt. Dieser hat immer Größe Θ(n).<br />
Wollen wir nun die Huffman-Codierung etwa auf das Alphabet {0, 1} 50 anwenden,<br />
so sehen wir, dass dieses kaum noch praktikabel ist. Deshalb wollen<br />
wir nun ein Codierungsverfahren kennen lernen, das angewandt auf Alphabete<br />
der Form A b deutlich effizienter ist <strong>als</strong> die Huffman-Codierung. Dieses<br />
Verfahren wurde von Shannon, Fano und Elias entwickelt. Wir nennen es<br />
die Shannon-Fano-Elias-Codierung, kurz SFE-Codierung. Wir werden dieses<br />
Verfahren zunächst für allgemeine Quelle erklären und dann für Quellen<br />
mit Alphabeten der Form A b effiziente Codier- und Decodieralgorithmen<br />
beschreiben. In diesem Fall wird das Verfahren arithmetische Codierung genannt.<br />
Wir betrachten eine Quelle mit Alphabet A = {a 1 , . . . , a n } und Wahrscheinlichkeitsverteilung<br />
p = (p 1 , . . . , p n ). Die p i müssen nicht sortiert sein. Für<br />
jedes i = 1, . . . , n definieren wir nun<br />
w i := ⌈log 1 p i<br />
⌉ + 1<br />
∑i−1<br />
L i := p j<br />
j=1<br />
(2.1)<br />
T i := L i + p i−1<br />
i<br />
2 = ∑<br />
p j + p i<br />
2 .<br />
Zusätzlich setzen wir L n+1 = 1. Die L i partitionieren das Einheitsintervall<br />
[0, 1) in n Teilintervalle I i := [L i , L i+1 ). Die Werte T i sind jeweils Mittelpunkt<br />
des Teilintervalls I i = [L i , L i+1 ). Die Breite von I i ist genau p i . Wir<br />
ordnen nun dem Symbol a i das i-te Teilintervall I i zu. Damit wird Symbolen<br />
ein Teilintervall mit Breite genau ihrer Quellwahrscheinlichkeit zugeordnet.<br />
j=1<br />
38
Nach Wahl von w i gilt<br />
2 −w i<br />
≤ p i<br />
2 .<br />
Weiter bezeichnen wir für eine Zahl x ∈ [0, 1] und ein c ∈ N mit ⌊x⌋ c die<br />
obersten c Bits der Binärdarstellung von x. Es gilt dann<br />
x − 0.⌊x⌋ c < 2 −c . (2.2)<br />
Die SFE-Codierung C ordnet nun dem Quellsymbol a i das Codewort<br />
C(a i ) = ⌊T i ⌋ wi (2.3)<br />
zu. Jedem Symbol a i wird <strong>als</strong>o der Mittelpunkt seines Teilintervalls I i , dargestellt<br />
mit w i Bits, zugeordnet.<br />
Beispiel: Betrachten wir die Quelle mit Quellsymbolen a 1 , a 2 , a 3 , a 4 und<br />
den Wahrscheinlichkeiten<br />
1<br />
16 , 3 16 , 9<br />
16 , 3 16 .<br />
Wir erhalten dann die folgenden Werte für w i , T i , C(a i ):<br />
i = 1 i = 2 i = 3 i = 4<br />
w i 5 4 2 4<br />
1<br />
T i 32<br />
5<br />
32<br />
17<br />
32<br />
29<br />
32<br />
C(a i ) 00001 0010 10 1101<br />
Abbildung 2.10 zeigt die Intervalle I i und ihre Mittelpunkte. Das zu a 3<br />
gehörige Intervall L 3 , L 4 ist fett in Rot eingezeichnet.<br />
Abbildung 2.10: Intervalleinteilung bei SFE-Codierung<br />
Wir erhalten nun<br />
Satz 2.7.1 Die SFE-Codierung liefert einen Präfix-Code.<br />
Beweis: Sei C(a i ) ein Präfix von C(a j ), d.h., C(a i ) und C(a j ) stimmen in<br />
den ersten w i Bits überein. Dann muss gelten |T i − T j | < 2 −w i<br />
, denn mit<br />
C(a i ), C(a j ) stimmen auch T i , T j in den obersten w i Bits überein. Nun gilt<br />
39
aber 2 −w i<br />
≤ p i /2 und |T i − T j | ≥ p i /2. Damit ist die Annahme, dass C(a i )<br />
ein Präfix von C(a j ) ist, zum Widerspruch geführt.<br />
Die SFE-Codierung ordnet wahrscheinlichen Symbolen Intervalle großer<br />
Breite zu. Mittelpunkte großer Intervall müssen aber nur mit wenigen Bits<br />
Präzision dargestellt werden, um nicht mit anderen Mittelpunkten verwechselt<br />
werden zu können. Dieses liefert die Kompression bei der SFE-Codierung.<br />
Satz 2.7.2 Für die erwartete Länge E(C) der SFE-Codierung C einer Quelle<br />
mit Wahrscheinlichkeitsverteilung p = (p 1 , . . . , p n ) gilt<br />
Beweis: Der Satz folgt aus<br />
H(p) < E(C) ≤ H(p) + 2.<br />
− log p i < w i ≤ − log p i + 2.<br />
Aus diesem Satz folgt unmittelbar, dass auch die SFE-Codierung ein asymptotisch<br />
optimales Codierungsverfahren ist. Denn angewandt auf das Alphabet<br />
A b mit Verteilung p b erreicht die SFE-Codierung eine erwartete Codierungslänge<br />
von höchstens H(p b ) + 2 = bH(p) + 2. Damit ist im Grenzwert<br />
die erwartete Codierungslänge pro Quellsymbol genau H(p).<br />
2.8 Arithmetische Codierung<br />
In diesem Abschnitt lernen wir effiziente Codier- und Decodieralgorithmen<br />
für die SFE-Codierung kennen, wenn das Quellalphabet A b und die Wahrscheinlichkeitsverteilung<br />
p b , b ∈ N, ist, wobei p eine Wahrscheinlichkeitsverteilung<br />
auf A = {a 1 , . . . , a n } ist. Die in diesem Abschnitt beschriebenen<br />
Techniken werden <strong>als</strong> arithmetische Codierung bezeichnet.<br />
Betrachten wir <strong>als</strong>o eine Quelle mit Alphabet A b , A = {a 1 , . . . , a n }. Die<br />
Verteilung auf A ist von der Form p = (Pr(a 1 ), . . . , Pr(a n )) = (p 1 , . . . , p n ).<br />
Die Wahrscheinlichkeit für das Quellsymbol x = (x 1 , . . . , x b ) ∈ A b bezeichnen<br />
wir mit p(x). Es gilt<br />
p(x) =<br />
b∏<br />
Pr(x i ).<br />
i=1<br />
Auf den Elementen aus A b definieren wir nun eine (totale) Ordnung
. . . < a n . Auf A b benutzen wir nun die lexikographische Ordnung bezüglich<br />
der Ordnung auf A. Sind <strong>als</strong>o x = (x 1 , . . . , x b ) und y = (y 1 , . . . , y b ) zwei<br />
Elemente aus A b so gilt x < y genau dann, wenn für den kleinsten Index<br />
1 ≤ k ≤ b mit x k ≠ y k gilt x k < y k .<br />
Um die arithmetische Codierung für A b mit Wahrscheinlichkeitsverteilung<br />
p b zu beschreiben, benutzen wir die folgende Notation. Wir setzen<br />
w(x) := ⌈log 1<br />
p(x) ⌉ + 1<br />
L(x) := ∑ p(y)<br />
y
müssen, um die die Codierung eines einzelnen Symbols zu bestimmen. Vielmehr<br />
kann die gerade beschriebene Idee des sukzessiven Verfeinerns benutzt<br />
werden, um einzelne Codeworte zu berechnen. Hierzu wird bei gegebenem<br />
Wort m = m 1 m 2 · · · m b zunächst das Teilintervall I s berechnet, indem das<br />
Intervall für m liegt. Dann wird nur in diesem Teilintervall nach dem korrektem<br />
Intervall für m gesucht. Die Bestimmung von I j ist einfach, denn der<br />
Index s ist gegeben durch 1 ≤ s ≤ n mit m 1 = a s . Weitere Teilintervalle<br />
können dann genauso bestimmt werden. Dieses liefert den folgenden Algorithmus<br />
zur Berechnung des Codewortes für m. Die Zahlen L s sind dabei<br />
definiert wie in der SFE-Codierung für das Alphabet A mit den Wahrscheinlichkeiten<br />
p 1 , . . . , p n .<br />
Eingabe m = m 1 m 2 · · · m b ∈ A b .<br />
Ideal-Encode-AC (IE-AC)<br />
1. Schritt Setze l 0 := 0, u 0 := 1, w 0 := 1.<br />
2. Schritt Für i = 1, . . . , b wiederhole die folgenden Schritte.<br />
3. Schritt Finde s mit a s = m i .<br />
4. Schritt Setze<br />
l i := l i−1 + w i−1 L s<br />
u i := l i−1 + w i−1 L s+1<br />
w i = w i−1 p s<br />
(2.7)<br />
5. Schritt Gib l b + w b<br />
2<br />
mit ⌈log 1 w b<br />
⌉ + 1 Bits Genauigkeit aus.<br />
Der Wert w i gibt jeweils die Breite des aktuellen Intervalls an. Es gilt w i =<br />
u i − l i .<br />
Mit dem oben Gesagten folgt leicht, dass dieser Algorithmus die Codierung<br />
C(m i ) korrekt berechnet. Etwas formaler folgt die Korrektheit durch<br />
vollständige Induktion über i aus den Gleichungen<br />
L(m) = ∑ y
Da jeder Durchlauf der Schleife im 2. Schritt nur konstante Anzahl von<br />
arithmetischen Operationen benötigt, ist die Laufzeit von IE-AC im RAM-<br />
Modell gegeben durch O(b). Wir werden hierzu allerdings noch viel mehr<br />
sagen müssen. Zunächst jedoch einige Beispiele.<br />
Beispiel 1: A = {a 1 , a 2 , a 3 }, p 1 = 0.8, p 2 = 0.02, p 3 = 0.18. Codiert werden<br />
soll m = a 1 a 3 a 2 a 1 . In der folgenden Tabelle sind die Werte s, l i − u i , w i<br />
im Laufe des Algorithmus IE-AC zusammengefasst. Die Werte für l i , u i , w i<br />
ergeben sich jeweils aus (2.7).<br />
s l i u i w i<br />
i = 0 − 0 1 1<br />
i = 1 1 0 0.8 0.8<br />
i = 2 3 0.656 0.8 0.144<br />
i = 3 2 0.7712 0.77408 0.00288<br />
i = 4 1 0.7712 0.773504 0.002304<br />
Da ⌈log(0.002304) −1 ⌉ = 9 und u 4 + w 4<br />
2<br />
= 0.772352 ist die Codierung von m<br />
gegeben durch 1100010110.<br />
Beispiel 2: Es sei A = {0, 1} mit den Quellwahrscheinlichkeiten p 1 =<br />
3<br />
4 , p 2 = 1 4<br />
. Weiter sei b = 5. Codiert werden soll m = 00101. Wir setzen<br />
a 1 = 0, a 2 01 und erhalten dann L 1 = 0, L 2 = 3 4 , L 3 = 1. Wir erhalten dann<br />
die folgende Tabelle für die Werte s, l i − u i , w i im Laufe des Algorithmus<br />
IE-AC.<br />
s l i u i w i<br />
i = 0 − 0 1 1<br />
i = 1 1 0<br />
3<br />
4<br />
i = 2 1 0<br />
9<br />
16<br />
3<br />
4<br />
9<br />
16<br />
i = 3 2<br />
27<br />
64<br />
i = 4 1<br />
27<br />
64<br />
9<br />
16<br />
135<br />
256<br />
9<br />
64<br />
27<br />
256<br />
i = 5 2<br />
513<br />
1024<br />
135<br />
256<br />
27<br />
1024<br />
Da ⌈log 27<br />
1024 ⌉ = 6 und u 5+l 5<br />
2<br />
= l 5 + w 5<br />
2<br />
= 1053<br />
2048<br />
ist die Codierung von m<br />
gegeben durch 1000001. In Abbildung 2.11 sind die einzelnen Teilintervalle,<br />
die im Laufe des Algorithmus berechnet werden, schematisch dargestellt.<br />
43
Abbildung 2.11: Beispiel für IE-AC<br />
Die sukzessive Unterteilung von Intervallen führt auch sofort auf den folgenden<br />
Algorithmus zur Decodierung eines einzelnen Codewortes.<br />
Eingabe Ein Codewort c ∈ {0, 1} ∗ .<br />
Ideal-Decode-AC (ID-AC)<br />
1. Schritt Setze l 0 := 0, u 0 := 1, w 0 := 1, m = ɛ, t = 0.c.<br />
2. Schritt Für i = 1, . . . , b wiederhole die folgenden Schritte.<br />
3. Schritt Finde s mit l i−1 + w i−1 L s ≤ t < l i−1 + w i−1 L s+1 .<br />
4. Schritt Setze<br />
5. Schritt Ausgabe m.<br />
l i := l i−1 + w i−1 L s<br />
u i := l i−1 + w i−1 L s+1<br />
w i = w i−1 p s<br />
m := ma s<br />
(2.9)<br />
Die Korrektheit des Algorithmus folgt aus der oben definierten Unterteilung<br />
in Teilintervalle und den Gleichungen in (2.8).<br />
44
Beispiel 4: Gegeben ist eine Quelle mit Alphabet A := {0, 1} und den<br />
Wahrscheinlichkeiten p 1 = p(0) = 3 4 und p 2 = p(1) = 1 4 . Damit gilt L 1 =<br />
0, L 2 = 3 4 und L 3 = 1. Ausserdem sei b = 3. Wir erhalten das Codewort<br />
c = 1010. Zunächst setzen wir l 0 = 0, u 0 = 1, m = ɛ und t := 0.10100 = 5 8 .<br />
Da 0 ≤ 5 8 < 3 4 , setzen wir s = 1 und damit ist m 1 = 0. Die neuen Parameterwerte<br />
sind nun<br />
l 1 = 0, u 1 = 3 4 , w 1 = 3 4 , m = 0.<br />
Als nächstes erhalten wir s = 2 und m 2 = 1, denn<br />
l 1 + w 1 L 2 = 0 + 3 3<br />
4 4 = 9<br />
16 ≤ 5 8 < 3 4 = l 1 + w 1 L 3 .<br />
Als neue Parameter erhalten wir<br />
Jetzt berechnen wir s = 1, denn<br />
l 2 = 9<br />
16 , u 2 = 3 4 , w 2 = 3<br />
16 , m = 01.<br />
l 2 + w 2 L 1 = 9 16 + 3 16 · 0 = 9 16 ≤ 5 8 < 9<br />
16 = l 2 + w 2 L 2 = 9 16 + 3 3<br />
16 4 = 45<br />
64 .<br />
Die neuen Parameterwerte sind<br />
l 3 = 9 16 , u 3 = 45<br />
64 , w 3 = 9<br />
64 , m = 010.<br />
Damit ist das Wort m = 010 decodiert.<br />
Beispiel 3: Gegeben ist die Quelle aus Beispiel 1. Es sei b = 2. Wir erhalten<br />
das Codewort c = 1111011100. Es gilt t = 0.c = 0.9648375. Wir setzen<br />
l 0 = 0, u 0 = 1, w 0 = 1 und m = ɛ. Da 0.82 ≤ 0.9648375 < 1, ist m 1 = a 3 .<br />
Die neuen Parameterwerte sind dann<br />
Da<br />
l 1 = 0.82, u − 1 = 1, w 1 = 0.18.<br />
0.82 + 0.18 · 0.8 ≤ 0.0.9648375 < 0.82 + 0.18 · 0.82,<br />
ist m 2 = a 2 . Das Codewort ist zu a 3 a 2 decodiert.<br />
45