Informationstheorie/Entropiecodierung nach Huffman: Unterschied zwischen den Versionen

Aus LNTwww
Wechseln zu:Navigation, Suche
 
(18 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 7: Zeile 7:
  
 
==Der Huffman–Algorithmus==   
 
==Der Huffman–Algorithmus==   
 
+
<br>
Wir setzen nun voraus, dass die Quellensymbole $q_\nu$ einem Alphabet $\{q_μ\} = \{$'''A''', '''B''', '''C''', ...$\}$ mit dem Symbolumfang $M$ entstammen und statistisch voneinander unabhängig seien. Beispielsweise gelte für den Symbolumfang $M = 8$:
+
Wir setzen nun voraus, dass die Quellensymbole&nbsp; $q_\nu$&nbsp; einem Alphabet&nbsp; $\{q_μ\} = \{$ $\rm A$,&nbsp; $\rm B$ ,&nbsp; $\rm C$ , ...$\}$&nbsp; mit dem Symbolumfang&nbsp; $M$&nbsp; entstammen und statistisch voneinander unabhängig seien.&nbsp; Beispielsweise gelte für den Symbolumfang&nbsp; $M = 8$:
 
   
 
   
:$$\{ \hspace{0.05cm}q_{\mu} \} = \{ \boldsymbol{\rm A} \hspace{0.05cm}, \boldsymbol{\rm B}\hspace{0.05cm}, \boldsymbol{\rm C}\hspace{0.05cm}, \boldsymbol{\rm D}\hspace{0.05cm}, \boldsymbol{\rm E}\hspace{0.05cm}, \boldsymbol{\rm F}\hspace{0.05cm}, \boldsymbol{\rm G}\hspace{0.05cm}, \boldsymbol{\rm H}\hspace{0.05cm}
+
:$$\{ \hspace{0.05cm}q_{\mu} \} = \{ \boldsymbol{\rm A} \hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm B}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm C}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm D}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm E}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm F}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm G}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm H}\hspace{0.05cm}
 
\}\hspace{0.05cm}.$$
 
\}\hspace{0.05cm}.$$
  
[https://de.wikipedia.org/wiki/David_A._Huffman David A. Huffman] hat 1952 – also kurz nach Shannons bahnbrechenden Veröffentlichungen – einen Algorithmus zur Konstruktion von optimalen präfixfreien Codes angegeben.
+
[https://de.wikipedia.org/wiki/David_A._Huffman David A. Huffman]&nbsp; hat 1952 – also kurz nach Shannons bahnbrechenden Veröffentlichungen – einen Algorithmus zur Konstruktion von optimalen präfixfreien Codes angegeben.&nbsp; Dieser&nbsp; '''Huffman–Algorithmus'''&nbsp; soll hier ohne Herleitung und Beweis angegeben werden, wobei wir uns auf Binärcodes beschränken.&nbsp; Das heißt: &nbsp; Für die Codesymbole gelte stets&nbsp; $c_ν ∈ \{$'''0''',&nbsp; '''1'''$\}$.  
Dieser ''Huffman–Algorithmus'' soll hier ohne Herleitung und Beweis angegeben werden, wobei wir uns hier auf Binärcodes beschränken. Das heißt: Für die Codesymbole gelte stets $c_ν ∈ \{$'''0''', '''1'''$\}$. Hier ist das Rezept:
+
 
*Man ordne die Symbole nach fallenden Auftrittswahrscheinlichkeiten.
+
Hier ist das &bdquo;Rezept&rdquo;:
*Man fasse die zwei unwahrscheinlichsten Symbole zu einem neuen Symbol zusammen.
+
# &nbsp; Man ordne die Symbole nach fallenden Auftrittswahrscheinlichkeiten.
*Man wiederhole (1) und (2), bis nur mehr zwei (zusammengefasste) Symbole übrig bleiben.
+
# &nbsp; Man fasse die zwei unwahrscheinlichsten Symbole zu einem neuen Symbol zusammen.
*Man codiert die wahrscheinlichere Symbolmenge mit '''1''' und die andere Menge mit '''0'''.
+
# &nbsp; Man wiederhole&nbsp; '''(1)'''&nbsp; und&nbsp; '''(2)''', bis nur mehr zwei (zusammengefasste) Symbole übrig bleiben.
*Man ergänzt in Gegenrichtung (also von unten nach oben) die jeweiligen Binärcodes der aufgespaltenen Teilmengen entsprechend den Wahrscheinlichkeiten mit '''1''' bzw. '''0'''.
+
# &nbsp; Man codiert die wahrscheinlichere Symbolmenge mit&nbsp; '''1'''&nbsp; und die andere Menge mit&nbsp; '''0'''.
 +
# &nbsp; Man ergänzt in Gegenrichtung&nbsp; (von unten nach oben)&nbsp; die jeweiligen Binärcodes der aufgespaltenen Teilmengen gemäß den Wahrscheinlichkeiten mit&nbsp; '''1'''&nbsp; bzw.&nbsp; '''0'''.
  
  
{{GraueBox|
+
{{GraueBox|TEXT=
TEXT='''Beispiel 1''':&nbsp; Ohne Einschränkung der Allgemeingültigkeit setzen wir voraus, dass die $M = 6$ Symbole '''A''', ... , '''F''' bereits entsprechend ihren Wahrscheinlichkeiten geordnet sind:
+
$\text{Beispiel 1:}$&nbsp; Ohne Einschränkung der Allgemeingültigkeit setzen wir voraus, dass die&nbsp; $M = 6$&nbsp; Symbole&nbsp; $\rm A$, ... , $\rm F$&nbsp; bereits nach ihren Wahrscheinlichkeiten geordnet sind:
 
   
 
   
 
:$$p_{\rm A} = 0.30 \hspace{0.05cm},\hspace{0.2cm}p_{\rm B} = 0.24 \hspace{0.05cm},\hspace{0.2cm}p_{\rm C} = 0.20 \hspace{0.05cm},\hspace{0.2cm}
 
:$$p_{\rm A} = 0.30 \hspace{0.05cm},\hspace{0.2cm}p_{\rm B} = 0.24 \hspace{0.05cm},\hspace{0.2cm}p_{\rm C} = 0.20 \hspace{0.05cm},\hspace{0.2cm}
Zeile 29: Zeile 30:
 
\hspace{0.05cm}.$$
 
\hspace{0.05cm}.$$
  
Durch paarweises Zusammenfassen und anschießendem Sortieren erhält man in fünf Schritten die folgenden Symbolkombinationen (resultierende Wahrscheinlichkeiten in Klammern):
+
Durch paarweises Zusammenfassen und anschießendes Sortieren erhält man in fünf Schritten die folgenden Symbolkombinationen <br>(resultierende Wahrscheinlichkeiten in Klammern):
:1. &nbsp; '''A''' (0.30), '''B''' (0.24), '''C''' (0.20), '''EF''' (0.14), '''D''' (0.12),
+
:1. &nbsp; $\rm A$&nbsp; (0.30), $\rm B$&nbsp; (0.24), $\rm C$&nbsp; (0.20), $\rm EF$&nbsp; (0.14), $\rm D$&nbsp; (0.12),
:2. &nbsp; '''A''' (0.30), '''EFD''' (0.26), '''B''' (0.24), '''C''' (0.20),
+
:2. &nbsp; $\rm A$&nbsp; (0.30), $\rm EFD$&nbsp; (0.26), $\rm B$&nbsp; (0.24), $\rm C$&nbsp; (0.20),
:3. &nbsp; '''BC''' (0.44), '''A''' (0.30), '''EFD''' (0.26),
+
:3. &nbsp; $\rm BC$&nbsp; (0.44), $\rm A$&nbsp; (0.30), $\rm EFD$&nbsp; (0.26),
:4. &nbsp; '''AEFD''' (0.56), '''BC''' (0.44),
+
:4. &nbsp; $\rm AEFD$&nbsp; (0.56), $\rm BC$&nbsp; (0.44),
:5. &nbsp; Root '''AEFDBC''' (1.00).
+
:5. &nbsp; Root&nbsp; $\rm AEFDBC$&nbsp; (1.00).
Rückwärts (gemäß den Schritten 5 bis 1) erfolgt dann die Zuordnung zu Binärsymbolen. Ein „x” weist darauf hin, dass in den nächsten Schritten noch Bits hinzugefügt werden müssen:
+
Rückwärts &ndash; also gemäß den Schritten&nbsp; '''(5)'''&nbsp; bis&nbsp; '''(1)'''&nbsp; &ndash; erfolgt dann die Zuordnung zu Binärsymbolen.&nbsp; <br>Ein&nbsp; '''x'''&nbsp; weist darauf hin, dass in den nächsten Schritten noch Bit hinzugefügt werden müssen:
:5. &nbsp; '''AEFD''' → '''1'''x,   '''BC''' → '''0'''x,
+
:5. &nbsp; $\rm AEFD$ &nbsp; &nbsp; '''1x''', &nbsp; &nbsp;  $\rm BC$ &nbsp; &nbsp; '''0x''',
:4. &nbsp; '''<u>A''' → '''11</u>''',   '''EFD''' → '''10'''x,
+
:4. &nbsp; $\underline{\rm A}$ &nbsp; → &nbsp; '''<u>11</u>''', &nbsp; &nbsp;  $\rm EFD$ &nbsp; &nbsp; '''10x''',
:3. &nbsp; '''<u>B''' → '''01</u>''', '''<u>C''' → '''00</u>''',
+
:3. &nbsp; $\underline{\rm B}$ &nbsp; → &nbsp; '''<u>01</u>''', &nbsp; &nbsp; $\underline{\rm C}$ &nbsp; → &nbsp; '''<u>00</u>''',
:2. &nbsp; '''EF''' → '''101'''x,   '''<u>D''' → '''100</u>''',
+
:2. &nbsp; $\rm EF$ &nbsp; &nbsp; '''101x''', &nbsp; &nbsp; $\underline{\rm D}$ &nbsp; → &nbsp; '''<u>100</u>''',
:1. &nbsp; '''<u>E''' → '''1011</u>''',   '''<u>F''' → '''1010</u>'''.
+
:1. &nbsp; $\underline{\rm E}$ &nbsp; → &nbsp; '''<u>1011</u>''', &nbsp; &nbsp; $\underline{\rm F}$ &nbsp; → &nbsp; '''<u>1010</u>'''.
 
Die Unterstreichungen markieren die endgültige Binärcodierung.}}
 
Die Unterstreichungen markieren die endgültige Binärcodierung.}}
  
Zeile 46: Zeile 47:
 
 
 
 
 
==Zum Begriff „Entropiecodierung”==   
 
==Zum Begriff „Entropiecodierung”==   
 
+
<br>
 
Wir gehen weiterhin von den Wahrscheinlichkeiten und Zuordnungen des letzten Beispiels aus:
 
Wir gehen weiterhin von den Wahrscheinlichkeiten und Zuordnungen des letzten Beispiels aus:
 
    
 
    
Zeile 60: Zeile 61:
 
\boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 1010} \hspace{0.05cm}.$$
 
\boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 1010} \hspace{0.05cm}.$$
  
Von den sechs Quellensymbolen werden also drei mit je zwei Bit, eines mit drei Bit und zwei Symbole ('''E''' und '''F''') mit vier Bit codiert. Die mittlere Codewortlänge ergibt sich damit zu
+
Von den sechs Quellensymbolen werden also drei mit je zwei Bit, eines mit drei Bit und zwei Symbole&nbsp;  $(\rm E$&nbsp;  und&nbsp;  $\rm F)$&nbsp;  mit je vier Bit codiert.  
 +
 
 +
Die mittlere Codewortlänge ergibt sich damit zu
 
   
 
   
 
:$$L_{\rm M} = (0.30 \hspace{-0.05cm}+ \hspace{-0.05cm}0.24 \hspace{-0.05cm}+ \hspace{-0.05cm} 0.20) \cdot 2  + 0.12 \cdot 3 + (0.10 \hspace{-0.05cm}+ \hspace{-0.05cm} 0.04 ) \cdot 4 = 2.4 \,{\rm bit/Quellensymbol}
 
:$$L_{\rm M} = (0.30 \hspace{-0.05cm}+ \hspace{-0.05cm}0.24 \hspace{-0.05cm}+ \hspace{-0.05cm} 0.20) \cdot 2  + 0.12 \cdot 3 + (0.10 \hspace{-0.05cm}+ \hspace{-0.05cm} 0.04 ) \cdot 4 = 2.4 \,{\rm bit/Quellensymbol}
 
\hspace{0.05cm}.$$
 
\hspace{0.05cm}.$$
  
Aus dem Vergleich mit der Quellenentropie $H = 2.365 \ \rm bit/Quellensymbol$ erkennt man die Effizienz der Huffman–Codierung.
+
Aus dem Vergleich mit der Quellenentropie&nbsp;  $H = 2.365 \ \rm bit/Quellensymbol$&nbsp;  erkennt man die Effizienz der Huffman–Codierung.
  
{{Box}}
+
{{BlaueBox|TEXT=
'''Merke:'''&nbsp; Es gibt keinen präfixfreien (⇒ sofort decodierbaren) Code, der allein unter Ausnutzung der Auftrittswahrscheinlichkeiten zu einer kleineren mittleren Codewortlänge $L_{\rm M}$ führt als der Huffman–Code. '''In diesem Sinne ist der Huffman–Code optimal'''. {{end}}
+
$\text{Merke:}$&nbsp;  
 +
Es gibt keinen präfixfreien&nbsp;  $($&nbsp; sofort decodierbaren$)$&nbsp;  Code, der allein unter Ausnutzung der Auftrittswahrscheinlichkeiten zu einer kleineren mittleren Codewortlänge&nbsp;  $L_{\rm M}$&nbsp;  führt als der Huffman–Code.&nbsp;  '''In diesem Sinne ist der Huffman–Code optimal'''.}}
  
  
{{GraueBox|
+
{{GraueBox|TEXT=
TEXT='''Beispiel 2''':&nbsp; Wären die Symbolwahrscheinlichkeiten
+
$\text{Beispiel 2:}$&nbsp; Wären die Symbolwahrscheinlichkeiten
 
   
 
   
 
:$$p_{\rm A} = p_{\rm B} = p_{\rm C} = 1/4 \hspace{0.05cm},\hspace{0.2cm}
 
:$$p_{\rm A} = p_{\rm B} = p_{\rm C} = 1/4 \hspace{0.05cm},\hspace{0.2cm}
Zeile 85: Zeile 89:
  
  
Aus dieser Eigenschaft $L_{\rm M} = H +\varepsilon$ mit $\varepsilon = 0$ bei geeigneten Auftrittswahrscheinlichkeiten erklärt sich der Begriff '''Entropiecodierung'''. Man versucht bei dieser Form von Quellencodierung, die Länge $L_μ$ der Binärfolge (bestehend aus Nullen und Einsen) für das Symbol $q_μ$ gemäß der Entropieberechnung wie folgt an dessen Auftrittswahrscheinlichkeit $p_μ$ anzupassen:
+
Aus dieser Eigenschaft&nbsp;  $L_{\rm M} = H +\varepsilon$&nbsp;  mit positivem&nbsp;  $\varepsilon \to 0$&nbsp;  bei geeigneten Auftrittswahrscheinlichkeiten erklärt sich der Begriff&nbsp;  '''Entropiecodierung''':
 +
 
 +
Man versucht bei dieser Form von Quellencodierung, die Länge&nbsp;  $L_μ$&nbsp;  der Binärfolge&nbsp;  (bestehend aus Nullen und Einsen)&nbsp;  für das Symbol&nbsp;  $q_μ$&nbsp;  gemäß der Entropieberechnung wie folgt an dessen Auftrittswahrscheinlichkeit&nbsp;  $p_μ$&nbsp;  anzupassen:
 
   
 
   
:$$L_{\mu} =  {\rm log}_2\hspace{0.1cm}(1/p_{\mu} )  \hspace{0.05cm}.$$
+
::$$L_{\mu} =  {\rm log}_2\hspace{0.1cm}(1/p_{\mu} )  \hspace{0.05cm}.$$
  
Natürlich gelingt das nicht immer, sondern nur dann, wenn alle Auftrittswahrscheinlichkeiten $p_μ$ in der Form $2^{–k}$ mit $k = 1, 2, 3,$ ...  dargestellt werden können.  
+
Natürlich gelingt das nicht immer, sondern nur dann, wenn alle Auftrittswahrscheinlichkeiten&nbsp;  $p_μ$&nbsp;  in der Form&nbsp;  $2^{–k}$&nbsp;  mit&nbsp;  $k = 1, \ 2, \ 3,$ ...  dargestellt werden können.  
*In diesem Sonderfall – und nur in diesem – stimmt die mittlere Codewortlänge $L_M$ exakt mit der Quellenentropie $H$ überein ($\varepsilon = 0$ siehe zweites Zahlenbeispiel).  
+
*In diesem Sonderfall – und nur in diesem – stimmt die mittlere Codewortlänge&nbsp;  $L_{\rm M}$&nbsp;  exakt mit der Quellenentropie&nbsp;  $H$&nbsp;  überein&nbsp;  $(\varepsilon = 0$,&nbsp;  siehe $\text{Beispiel 2})$.  
*Nach dem [[Informationstheorie/Allgemeine_Beschreibung#Quellencodierungstheorem|Quellencodierungstheorem]] gibt es keinen (decodierbaren) Code, der im Mittel mit weniger Binärzeichen pro Quellensymbol auskommt.
+
*Nach dem&nbsp;  [[Informationstheorie/Allgemeine_Beschreibung#Quellencodierungstheorem|Quellencodierungstheorem]]&nbsp;  gibt es keinen&nbsp; (decodierbaren)&nbsp; Code, der im Mittel mit weniger Binärzeichen pro Quellensymbol auskommt.
  
 
 
 
 
 
==Darstellung des Huffman–Codes als Baumdiagramm==
 
==Darstellung des Huffman–Codes als Baumdiagramm==
 +
<br>
 +
Häufig wird zur Konstruktion des Huffman–Codes eine&nbsp;  '''Baumstruktur'''&nbsp;  verwendet.&nbsp;  Für das bisher betrachtete Beispiel ist diese in der folgenden Grafik dargestellt:
  
Häufig wird für die Konstruktion des Huffman–Codes eine '''Baumstruktur''' verwendet. Für das bisher betrachtete Beispiel zeigt diese die folgende Grafik:
+
[[Datei:P_ID2418__Inf_T_2_3_S3_neu.png|frame|Baumdarstellung  der Huffman–Codierung für das&nbsp;  $\text{Beispiel 1}$]]
 
 
[[Datei:P_ID2418__Inf_T_2_3_S3_neu.png|Baumdarstellung  der Huffman–Codierung]]
 
  
 
Man erkennt:
 
Man erkennt:
 
*Bei jedem Schritt des Huffman–Algorithmus werden die beiden Zweige mit den jeweils kleinsten Wahrscheinlichkeiten zusammengefasst.  
 
*Bei jedem Schritt des Huffman–Algorithmus werden die beiden Zweige mit den jeweils kleinsten Wahrscheinlichkeiten zusammengefasst.  
*Der Knoten im Schritt 1 fasst die zwei Symbole '''E''' und '''F''' mit den aktuell kleinsten Wahrscheinlichkeiten zusammen. Dieser Knoten ist mit $p_{\rm E} + p_{\rm F} = 0.14$ beschriftet.
+
*Der Knoten im ersten Schritt fasst die zwei Symbole&nbsp;  $\rm E$&nbsp;  und&nbsp;  $\rm F$&nbsp;  mit den aktuell kleinsten Wahrscheinlichkeiten zusammen.&nbsp;  Dieser neue Knoten ist mit&nbsp;  $p_{\rm E} + p_{\rm F} = 0.14$&nbsp;  beschriftet.
*Der vom Symbol mit der kleineren Wahrscheinlichkeit (hier '''F''') zum Summenknoten verlaufende Zweig ist blau eingezeichnet, der andere Zweig (für '''E''') rot.
+
*Der vom Symbol mit der kleineren Wahrscheinlichkeit&nbsp;  $($hier&nbsp;  $\rm F)$&nbsp;  zum Summenknoten verlaufende Zweig ist blau eingezeichnet, der andere Zweig&nbsp;  $($für $\rm E)$&nbsp;  rot.
 +
*Nach fünf Schritten ist man bei der Baumwurzel&nbsp;  („Root”)&nbsp;  mit der Gesamtwahrscheinlichkeit&nbsp;  $1.00$&nbsp;  angelangt.&nbsp; 
  
Nach fünf Schritten ist man bei der Baumwurzel („Root”) mit der Gesamtwahrscheinlichkeit $1$ angelangt. Verfolgt man nun den Verlauf von der Wurzel (in obiger Grafik mit gelber Füllung) zu den einzelnen Symbolen zurück, so kann man aus den Farben der einzelnen Zweige die Symbolzuordnung ablesen. Mit den Zuordnungen „rot”  →  '''1''' und „blau”  →  '''0''' ergibt sich beispielsweise von der Wurzel zu Symbol
 
* '''A''':  &nbsp;  rot, rot  →  '''11''',
 
*'''B''':  &nbsp; blau, rot  →  '''01''',
 
*'''C''':  &nbsp; blau, blau  →  '''00''',
 
*'''D''':  &nbsp; rot, blau, blau  →  '''100''',
 
*'''E''':  &nbsp; rot, blau, rot, rot  →  '''1011''',
 
*'''F''':  &nbsp; rot, blau, rot, blau  →  '''1010'''.
 
  
Die Zuordnung „rot” →  '''0''' und „blau”  →  '''1''' würde ebenfalls zu einem optimalen präfixfreien Huffman–Code führen.
+
Verfolgt man nun den Verlauf von der Wurzel&nbsp; (in obiger Grafik mit gelber Füllung)&nbsp; zu den einzelnen Symbolen zurück, so kann man aus den Farben der einzelnen Zweige die Symbolzuordnung ablesen.  
 
 
{{GraueBox|
 
TEXT='''Beispiel 3''':&nbsp; Die folgende Grafik zeigt die Huffman–Codierung von 49 Symbolen $q_ν ∈ \{$ '''A''', '''B''', '''C''', '''D''', '''E''', '''F''' $\}$ mit der auf der letzten Seite hergeleiteten Zuordnung. Die binäre Codesymbolfolge weist die mittlere Codewortlänge $L_{\rm M} = 125/49 = 2.551$ auf. Die Farben dienen ausschließlich zur besseren Orientierung.
 
  
[[Datei:P_ID2419__Inf_T_2_3_S3b_neu.png|Beispielfolgen bei Huffman–Codierung]]
+
Mit den Zuordnungen „rot” &nbsp;  → &nbsp;  '''1'''&nbsp; und „blau”  &nbsp;  → &nbsp;  '''0'''&nbsp; ergibt sich beispielsweise von der Wurzel zu Symbol
 +
*$\rm A$:   &nbsp;  rot, rot  &nbsp;  → &nbsp;  '''11''',
 +
*$\rm B$:  &nbsp; blau, rot  &nbsp;  → &nbsp;  '''01''',
 +
*$\rm C$:  &nbsp; blau, blau  &nbsp;  → &nbsp;  '''00''',
 +
*$\rm D$:  &nbsp; rot, blau, blau  &nbsp;  → &nbsp;  '''100''',
 +
*$\rm E$:  &nbsp; rot, blau, rot, rot  &nbsp;  → &nbsp;  '''1011''',
 +
*$\rm F$:  &nbsp; rot, blau, rot, blau  &nbsp;  → &nbsp;  '''1010'''.
  
Aufgrund der kurzen Quellensymbolfolge ($N = 49$) weichen die Auftrittshäufigkeiten $h_{\rm A}$, ... , $h_{\rm F}$ der simulierten Folgen signifikant von den vorgegebenen Wahrscheinlichkeiten $p_{\rm A}$, ... , $p_{\rm F}$ ab:
 
  
:$$p_{\rm A} = 0.30 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm A} = 16/49 \approx 0.326 \hspace{0.05cm},\hspace{0.4cm}p_{\rm B} = 0.24 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm B} = 7/49 \approx 0.143 \hspace{0.05cm},$$
+
Die&nbsp; (einheitliche)&nbsp; Zuordnung „rot”  &nbsp;  → &nbsp;  '''0''' und „blau”  &nbsp;  → &nbsp;  '''1''' würde ebenfalls zu einem optimalen präfixfreien Huffman–Code führen.
+
 
:$$p_{\rm C} =0.24 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm C}= 9/49 \approx  0.184 \hspace{0.05cm},\hspace{0.6cm}p_{\rm D} = 0.12 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm D} = 7/49 \approx  0.143 \hspace{0.05cm},$$
+
{{GraueBox|TEXT=
 
+
$\text{Beispiel 3:}$&nbsp;
:$$p_{\rm E}=0.10 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm E} = 5/49 \approx 0.102 \hspace{0.05cm},\hspace{0.6cm}p_{\rm F} = 0.04 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm E} = 5/49 \approx 0.102  
+
Die folgende Grafik zeigt die Huffman–Codierung von&nbsp;  $49$&nbsp; Symbolen&nbsp; $q_ν ∈ \{$ $\rm A$,&nbsp; $\rm B$,&nbsp; $\rm C$,&nbsp; $\rm D$,&nbsp; $\rm E$,&nbsp; $\rm F$ $\}$&nbsp; mit der auf der letzten Seite hergeleiteten Zuordnung.
 +
[[Datei:Inf_T_2_3_S3b_version2.png|right|frame|Beispielfolgen bei Huffman–Codierung]]
 +
*Die binäre Codesymbolfolge weist die mittlere Codewortlänge&nbsp; $L_{\rm M} = 125/49 = 2.551$&nbsp; auf.&nbsp;
 +
*Die verschiedenen Farben dienen ausschließlich zur besseren Orientierung.
 +
*Aufgrund der kurzen Quellensymbolfolge&nbsp; $(N = 49)$&nbsp; weichen die Auftrittshäufigkeiten&nbsp; $h_{\rm A}$, ... ,&nbsp; $h_{\rm F}$&nbsp; der simulierten Folgen (manchmal) signifikant von den gegebenen Wahrscheinlichkeiten&nbsp; $p_{\rm A}$, ... ,&nbsp; $p_{\rm F}$&nbsp; ab:
 +
:$$p_{\rm A} = 0.30 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm A} = 16/49 \approx 0.326 \hspace{0.05cm},$$
 +
:$$p_{\rm B} = 0.24 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm B} = 7/49 \approx 0.143 \hspace{0.05cm},$$  
 +
:$$p_{\rm C} =0.24 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm C}= 9/49 \approx  0.184 \hspace{0.05cm},$$
 +
:$$p_{\rm D} = 0.12 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm D} = 7/49 \approx  0.143 \hspace{0.05cm},$$
 +
:$$p_{\rm E}=0.10 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm E} = 5/49 \approx 0.102 \hspace{0.05cm},$$
 +
:$$p_{\rm F} = 0.04 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm E} = 5/49 \approx 0.102  
 
\hspace{0.05cm}.$$
 
\hspace{0.05cm}.$$
 
+
*Damit ergibt sich ein etwas größerer Entropiewert:
Damit ergibt sich ein etwas größerer Entropiewert:
 
 
    
 
    
:$$H ({\rm bez\ddot{u}glich }\hspace{0.15cm}p_{\mu}) = 2.365 \,{\rm bit/Quellensymbol}\hspace{0.3cm}  
+
:$$H ({\rm bez\ddot{u}glich }\hspace{0.15cm}p_{\mu}) = 2.365 \ {\rm bit/Quellensymbol}\hspace{0.3cm}  
 
\Rightarrow \hspace{0.3cm}  
 
\Rightarrow \hspace{0.3cm}  
H ({\rm bez\ddot{u}glich }\hspace{0.15cm}h_{\mu}) = 2.451 \,{\rm bit/Quellensymbol}
+
H ({\rm bez\ddot{u}glich }\hspace{0.15cm}h_{\mu}) = 2.451 \ {\rm bit/Quellensymbol}
 
\hspace{0.05cm}.$$
 
\hspace{0.05cm}.$$
  
Würde man den Huffman–Code mit diesen „neuen” Wahrscheinlichkeiten $h_{\rm A}$, ... , $h_{\rm F}$ bilden, so ergäben sich folgende Zuordnungen:
+
:Würde man den Huffman–Code mit diesen „neuen Wahrscheinlichkeiten”&nbsp; $h_{\rm A}$, ... , $h_{\rm F}$&nbsp; bilden, so ergäben sich folgende Zuordnungen:
 
   
 
   
:$$\boldsymbol{\rm A} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 11} \hspace{0.05cm},\hspace{0.2cm}
+
::&nbsp; &nbsp; &nbsp;$\boldsymbol{\rm A} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''11'''$\hspace{0.05cm},\hspace{0.2cm}
\boldsymbol{\rm B} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 100} \hspace{0.05cm},\hspace{0.2cm}
+
\boldsymbol{\rm B} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''100'''$\hspace{0.05cm},\hspace{0.2cm}
\boldsymbol{\rm C} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 00} \hspace{0.05cm},\hspace{0.2cm}
+
\boldsymbol{\rm C} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''00'''$\hspace{0.05cm},\hspace{0.2cm}
\boldsymbol{\rm D} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 101} \hspace{0.05cm},\hspace{0.2cm}
+
\boldsymbol{\rm D} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''101'''$\hspace{0.05cm},\hspace{0.2cm}
\boldsymbol{\rm E} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 010} \hspace{0.05cm},\hspace{0.2cm}
+
\boldsymbol{\rm E} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''010'''$\hspace{0.05cm},\hspace{0.2cm}
\boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 011} \hspace{0.05cm}.$$
+
\boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''011'''$\hspace{0.05cm}.$
 +
 
 +
:Nun würden nur&nbsp; $\rm A$&nbsp; und&nbsp; $\rm C$&nbsp; mit zwei Bit dargestellt, die anderen vier Symbole durch jeweils drei Bit.
 +
:*Die Codesymbolfolge hätte dann eine Länge von&nbsp; $(16 + 9) · 2 + (7 + 7 + 5 + 5) · 3 = 122$&nbsp; Bit, wäre also um drei Bit kürzer als nach der bisherigen Codierung.
 +
:*Die mittlere Codewortlänge wäre dann&nbsp; $L_{\rm M} = 122/49 ≈ 2.49$&nbsp;  bit/Quellensymbol&nbsp; anstelle von&nbsp; $L_{\rm M}≈ 2.55$&nbsp;  bit/Quellensymbol.}}
 +
 
  
Nun würden nur '''A''' und '''C''' mit zwei Bit dargestellt, die anderen vier Symbole durch jeweils drei Bit. Die Codesymbolfolge hätte dann eine Länge von (16 + 9) · 2 + (7 + 7 + 5 + 5) · 3 = 122 Bit, wäre also um drei Bit kürzer als nach der bisherigen Codierung. Die mittlere Codewortlänge wäre dann $L_{\rm M} = 122/49 ≈ 2.49 \ \rm  bit/Quellensymbol$ anstelle von $L_{\rm M}≈ 2.55 \ \rm  bit/Quellensymbol$.}}
+
Das folgende interaktive Applet&nbsp; (in zwei Versionen)&nbsp; verdeutlicht die Vorgehensweise bei zwei Varianten einer Entropiecodierung.
 +
*&nbsp; [[Applets:Huffman-_und_Shannon-Fano-Codierung|Huffman- und Shannon-Fano-Codierung&nbsp; &rArr; &nbsp; $\text{HTML 5/JS}$&ndash;Version]],
 +
*&nbsp; [[Applets:Huffman_Shannon_Fano|Huffman- und Shannon-Fano-Codierung&nbsp; &rArr; &nbsp; $\text{SWF}$&ndash;Version]].
  
  
 +
{{BlaueBox|TEXT=
 +
$\text{Fazit:}$&nbsp;
 
Dieses Beispiel lässt sich wie folgt interpretieren:
 
Dieses Beispiel lässt sich wie folgt interpretieren:
*Die Huffman–Codierung lebt von der (genauen) Kenntnis der Symbolwahrscheinlichkeiten. Sind diese sowohl dem Sender als auch dem Empfänger bekannt, so ist die mittlere Codewortlänge $L_{\rm M}$ oft nur unwesentlich größer als die Quellenentropie $H$.
+
*Die Huffman–Codierung lebt von der&nbsp; (genauen)&nbsp; Kenntnis der Symbolwahrscheinlichkeiten.&nbsp; Sind diese sowohl dem Sender als auch dem Empfänger bekannt, so ist die mittlere Codewortlänge&nbsp; $L_{\rm M}$&nbsp; oft nur unwesentlich größer als die Quellenentropie&nbsp; $H$.
*Insbesondere aber bei kleinen Dateien kann es zu Abweichungen zwischen den (erwarteten) Symbolwahrscheinlichkeiten $p_μ$ und den (tatsächlichen) Symbolhäufigkeiten $h_μ$ kommen. Besser wäre es hier, für jede Datei einen eigenen Huffman–Code zu generieren, der auf den tatsächlichen Gegebenheiten ($h_μ$) basiert.
+
*Insbesondere bei kleinen Dateien kann es zu Abweichungen zwischen den&nbsp; (erwarteten)&nbsp; Symbolwahrscheinlichkeiten&nbsp; $p_μ$&nbsp; und den&nbsp; (tatsächlichen)&nbsp; Häufigkeiten&nbsp; $h_μ$&nbsp; kommen.&nbsp; Besser wäre es hier, für jede Datei einen eigenen Huffman–Code zu generieren, der auf den tatsächlichen Gegebenheiten&nbsp; $(h_μ)$&nbsp; basiert.
*In diesem Fall muss aber dem Decoder auch der spezifische Huffman–Code mitgeteilt werden. Dies führt zu einem gewissen Overhead, der nur wieder bei längeren Dateien vernachlässigt werden kann. Bei kleinen Dateien lohnt sich dieser Aufwand nicht.
+
*In diesem Fall muss aber dem Decoder auch der spezifische Huffman–Code mitgeteilt werden.&nbsp; Dies führt zu einem gewissen Overhead, der nur wieder bei längeren Dateien vernachlässigt werden kann.&nbsp; Bei kleinen Dateien lohnt sich dieser Aufwand nicht.}}
 
 
 
 
  
 
==Einfluss von Übertragungsfehlern auf die Decodierung ==
 
==Einfluss von Übertragungsfehlern auf die Decodierung ==
 +
<br>
 +
Der Huffman–Code ist aufgrund der Eigenschaft „präfixfrei” verlustlos.
 +
*Das bedeutet: &nbsp; Aus der binären Codesymbolfolge lässt sich die Quellensymbolfolge vollständig rekonstruieren.
 +
*Kommt es aber bei der Übertragung zu einem Fehler&nbsp; $($aus einer&nbsp; '''0'''&nbsp; wird eine&nbsp; '''1'''&nbsp; bzw. aus einer&nbsp; '''1'''&nbsp; eine&nbsp; '''0'''$)$,&nbsp; so stimmt natürlich auch die Sinkensymbolfolge&nbsp; $〈v_ν〉$&nbsp; nicht mit der Quellensymbolfolge&nbsp; $〈q_ν〉$&nbsp; überein.
  
Der Huffman–Code ist aufgrund der Eigenschaft „präfixfrei” verlustlos.
 
*Das bedeutet: Aus der binären Codesymbolfolge lässt sich die Quellensymbolfolge vollständig rekonstruieren.
 
*Kommt es aber bei der Übertragung zu einem Fehler (aus einer '''0''' wird eine '''1''' bzw. aus einer '''1''' eine '''0'''), so stimmt natürlich auch die Sinkensymbolfolge $〈v_ν〉$ nicht mit der Quellensymbolfolge $〈q_ν〉$ überein.
 
  
 
Die beiden folgenden Beispiele zeigen, dass ein einziger Übertragungsfehler manchmal eine Vielzahl von Fehlern hinsichtlich des Ursprungstextes zur Folge haben kann.
 
Die beiden folgenden Beispiele zeigen, dass ein einziger Übertragungsfehler manchmal eine Vielzahl von Fehlern hinsichtlich des Ursprungstextes zur Folge haben kann.
  
{{GraueBox|
+
{{GraueBox|TEXT=
TEXT='''Beispiel 4''':&nbsp; Wir betrachten die gleiche Quellensymbolfolge und den gleichen Huffman–Code wie auf der vorherigen Seite. Die obere Grafik zeigt, dass bei fehlerfreier Übertragung aus der codierten Binärfolge '''111011'''... wieder die ursprüngliche Quellenfolge '''AEBFCC'''... rekonstruiert werden kann.
+
$\text{Beispiel 4:}$&nbsp;  
 +
Wir betrachten die gleiche Quellensymbolfolge und den gleichen Huffman–Code wie auf der vorherigen Seite.  
  
[[Datei:P_ID2420__Inf_T_2_3_S4b_neu.png|Zum Einfluss von Übertragungsfehlern bei Huffman–Codierung]]
+
[[Datei:P_ID2420__Inf_T_2_3_S4b_neu.png|frame|Zum Einfluss von Übertragungsfehlern bei Huffman–Codierung]]
  
*Wird aber zum Beispiel das Bit 6 verfälscht (von '''1''' auf '''0''', rote Markierung in der mittlere Grafik), so wird aus dem Quellensymbol $q_2 =$ '''E''' das Sinkensymbol $v_2 =$ '''F'''.
+
*Die obere Grafik zeigt, dass bei fehlerfreier Übertragung aus der codierten Binärfolge&nbsp; '''111011'''...&nbsp; wieder die ursprüngliche Quellenfolge&nbsp; $\rm AEBFCC$...&nbsp; rekonstruiert werden kann.
*Eine Verfälschung von Bit 13 (von '''0''' auf  '''1''', rote Markierung in der unteren Grafik) führt sogar zu einer Verfälschung von vier Quellensymbolen: '''CCEC'''   →  '''DBBD'''.}}
+
*Wird aber zum Beispiel das Bit 6 verfälscht&nbsp; $($von&nbsp; '''1'''&nbsp; auf&nbsp; '''0''', rote Markierung in der mittlere Grafik$)$, so wird aus dem Quellensymbol&nbsp; $q_2 = \rm E$&nbsp; das Sinkensymbol&nbsp; $v_2 =\rm F$.
 +
*Eine Verfälschung von Bit 13&nbsp; $($von&nbsp; '''0'''&nbsp; auf&nbsp; '''1''', rote Markierung in der unteren Grafik$)$&nbsp; führt sogar zu einer Verfälschung von vier Quellensymbolen: &nbsp; $\rm CCEC$&nbsp;   →&nbsp;   $\rm DBBD$.}}
  
  
{{GraueBox|
+
{{GraueBox|TEXT=
TEXT='''Beispiel 5''':&nbsp; Eine zweite Nachrichtenquelle mit Symbolumfang $M = 6$ ist durch folgende Symbolwahrscheinlichkeiten gekennzeichnet:
+
$\text{Beispiel 5:}$&nbsp;  
 +
Eine zweite Nachrichtenquelle mit Symbolumfang&nbsp; $M = 6$&nbsp; sei durch folgende Symbolwahrscheinlichkeiten gekennzeichnet:
 
   
 
   
 
:$$p_{\rm A} = 0.50 \hspace{0.05cm},\hspace{0.2cm}p_{\rm B} = 0.19 \hspace{0.05cm},\hspace{0.2cm}p_{\rm C} = 0.11 \hspace{0.05cm},\hspace{0.2cm}
 
:$$p_{\rm A} = 0.50 \hspace{0.05cm},\hspace{0.2cm}p_{\rm B} = 0.19 \hspace{0.05cm},\hspace{0.2cm}p_{\rm C} = 0.11 \hspace{0.05cm},\hspace{0.2cm}
Zeile 179: Zeile 203:
  
 
Hier führt der Huffman–Algorithmus zu folgender Zuordnung:
 
Hier führt der Huffman–Algorithmus zu folgender Zuordnung:
 +
 +
:&nbsp; &nbsp; &nbsp;$\boldsymbol{\rm A} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''0'''$\hspace{0.05cm},\hspace{0.2cm}
 +
\boldsymbol{\rm B} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''111'''$\hspace{0.05cm},\hspace{0.2cm}
 +
\boldsymbol{\rm C} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''101'''$\hspace{0.05cm},\hspace{0.2cm}
 +
\boldsymbol{\rm D} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''100'''$\hspace{0.05cm},\hspace{0.2cm}
 +
\boldsymbol{\rm E} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''1101'''$\hspace{0.05cm},\hspace{0.2cm}
 +
\boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$'''1100'''$\hspace{0.05cm}.$
 
   
 
   
:$$\boldsymbol{\rm A} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 0} \hspace{0.05cm},\hspace{0.2cm}
+
[[Datei:P_ID2423__Inf_T_2_3_S4c_neu.png|right|frame|Zur Fehlerfortpflanzung der Huffman–Codierung]]
\boldsymbol{\rm B} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 111} \hspace{0.05cm},\hspace{0.2cm}
 
\boldsymbol{\rm C} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 101} \hspace{0.05cm},\hspace{0.2cm}
 
\boldsymbol{\rm D} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 100} \hspace{0.05cm},\hspace{0.2cm}
 
\boldsymbol{\rm E} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 1101} \hspace{0.05cm},\hspace{0.2cm}
 
\boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 1100} \hspace{0.05cm}.$$
 
  
Die Quellensymbolfolge '''ADABD'''... (siehe Grafik) wird somit durch die Codesymbolfolge '''0'100'0'111'100' '''... dargestellt. Die Hochkommata dienen hierbei lediglich der Orientierung.
 
  
[[Datei:P_ID2423__Inf_T_2_3_S4c_neu.png|Zur Fehlerfortpflanzung der Huffman–Codierung]]
+
Die Quellensymbolfolge&nbsp; $\rm ADABD$...&nbsp; (siehe Grafik) wird somit durch die Codesymbolfolge&nbsp; '''0'100'0'111'100' '''...&nbsp; dargestellt.&nbsp; Die Hochkommata dienen hierbei lediglich der Orientierung für den Leser.
  
Bei der Übertragung wird nun das erste Bit verfälscht: Anstelle von '''01000111100'''... empfängt man somit '''11000111100'''...  
+
Bei der Übertragung wird nun das erste Bit verfälscht:&nbsp; Anstelle von&nbsp; '''01000111100'''...&nbsp; empfängt man somit&nbsp; '''11000111100'''...  
*Aus den beiden ersten Quellensymbolen '''AD''' → '''0100''' wird  nach der Decodierung das Sinkensymbol '''F''' → '''1100'''.  
+
*Aus den beiden ersten Quellensymbolen&nbsp; $\rm AD$&nbsp; &nbsp; '''0100'''&nbsp; wird  nach der Decodierung das Sinkensymbol&nbsp; $\rm F$&nbsp; &nbsp; '''1100'''.  
*Die weiteren Symbole werden dann wieder richtig detektiert, aber nun nicht mehr beginnend bei der Position $ν = 3$, sondern bei $ν = 2$.
+
*Die weiteren Symbole werden dann wieder richtig detektiert, aber nun nicht mehr beginnend bei der Position&nbsp; $ν = 3$, sondern bei&nbsp; $ν = 2$.
  
  
 
Je nach Anwendung sind die Auswirkungen unterschiedlich:
 
Je nach Anwendung sind die Auswirkungen unterschiedlich:
 
*Handelt es sich bei der Quelle um einen natürlichen Text und bei der Sinke um einen Menschen, so bleibt der Großteil des Textes für den Leser verständlich.
 
*Handelt es sich bei der Quelle um einen natürlichen Text und bei der Sinke um einen Menschen, so bleibt der Großteil des Textes für den Leser verständlich.
*Ist die Sinke jedoch ein Automat, der sukzessive alle $v_ν$ mit den entsprechenden $q_ν$ vergleicht, so ergibt sich eine Verfälschungshäufigkeit von deutlich über 50%.
+
*Ist die Sinke jedoch ein Automat, der sukzessive alle&nbsp; $v_ν$&nbsp; mit den entsprechenden&nbsp; $q_ν$&nbsp; vergleicht, so ergibt sich eine Verfälschungshäufigkeit von deutlich über&nbsp; $50\%$.
*Nur die blauen Symbole der Sinkensymbolfolge $〈v_ν〉$ stimmen dann (zufällig) mit den entsprechenden Quellensymbolen $q_ν$ überein, während rote Symbole auf Fehler hinweisen.}}
+
*Nur die blauen Symbole der Sinkensymbolfolge&nbsp; $〈v_ν〉$&nbsp; stimmen dann (zufällig) mit den Quellensymbolen&nbsp; $q_ν$&nbsp; überein, während rote Symbole auf Fehler hinweisen.}}
  
  
 
 
 
 
==Anwendung der Huffman–Codierung auf k–Tupel ==
+
==Anwendung der Huffman–Codierung auf&nbsp; $k$–Tupel ==
 
+
<br>
 
Der Huffman–Algorithmus in seiner Grundform liefert dann unbefriedigende Ergebnisse, wenn
 
Der Huffman–Algorithmus in seiner Grundform liefert dann unbefriedigende Ergebnisse, wenn
*eine Binärquelle ($M = 2$) vorliegt, zum Beispiel mit dem Symbolvorrat $\{$'''X''', '''Y'''$\}$,
+
*eine Binärquelle&nbsp; $(M = 2)$&nbsp; vorliegt, zum Beispiel mit dem Symbolvorrat&nbsp; $\{$ $\rm X$,&nbsp; $\rm Y$ $\}$,
 
*es statistische Bindungen zwischen den Symbolen der Eingangsfolge gibt,
 
*es statistische Bindungen zwischen den Symbolen der Eingangsfolge gibt,
*die Wahrscheinlichkeit des häufigsten Symbols deutlich größer ist als 50%.
+
*die Wahrscheinlichkeit des häufigsten Symbols deutlich größer ist als&nbsp; $50\%$.
  
Abhilfe schafft man in diesen Anwendungsfällen, in dem man mehrere Symbole zusammenfasst und den Huffman–Algorithmus auf einen neuen Symbolvorrat $\{$'''A''', '''B''', '''C''', '''D''', ... $\}$ anwendet.
 
  
Bildet man $k$–Tupel, so steigt der Symbolumfang von $M$ auf $M ′ = M^k$. Wir wollen im folgenden Beispiel die Vorgehensweise anhand einer Binärquelle verdeutlichen. Weitere Beispiele finden Sie in der [[Aufgaben:2.07_Zweiertupel_-_Huffman|Aufgabe 2.7]], der[[Aufgaben:2.07Z_Ternärquelle-Zweiertupel|Zusatzaufgabe 2.7Z]] und der [[Aufgaben:2.08_Markovquelle_und_Huffman|Aufgabe 2.8]].
+
Abhilfe schafft man in diesen Anwendungsfällen,
 +
*in dem man mehrere Symbole zusammenfasst, und
 +
*den Huffman–Algorithmus auf einen neuen Symbolvorrat&nbsp; $\{$ $\rm A$,&nbsp; $\rm B$, $\rm C$,&nbsp; $\rm D$, ... $\}$&nbsp; anwendet.
  
{{GraueBox|
+
 
TEXT='''Beispiel 6''':&nbsp; Gegeben sei eine gedächtnislose Binärquelle ($M = 2$) mit den Symbolen $\{$'''X''', '''Y'''$\}$:
+
Bildet man&nbsp; $k$–Tupel, so steigt der Symbolumfang von&nbsp; $M$&nbsp; auf&nbsp; $M\hspace{-0.01cm}′ = M^k$.
*Die Symbolwahrscheinlichkeiten seien $p_{\rm X}$ = 0.8 und $p_{\rm Y}$ = 0.2.
+
 
*Damit ergibt sich die Quellenentropie zu $H$ = 0.722 bit/Quellensymbol.
+
Wir wollen im folgenden Beispiel die Vorgehensweise anhand einer Binärquelle verdeutlichen.&nbsp; Weitere Beispiele finden Sie in 
*Wir betrachten die Symbolfolge '''XXXYXXXXXXXXYYXXXXXYYXXYXYXXYX'''.... mit nur wenig '''Y'''&ndash;Symbolen an den Positionen 3, 13, 14, ...
+
*der&nbsp; [[Aufgaben:Aufgabe_2.7:_Huffman-Anwendung_für_binäre_Zweiertupel|Aufgabe 2.7]],
 +
*der&nbsp; [[Aufgaben:Aufgabe_2.7Z:_Huffman-Codierung_für_Zweiertupel_einer_Ternärquelle|Aufgabe 2.7Z]] und
 +
*der&nbsp;  [[Aufgaben:Aufgabe_2.8:_Huffman-Anwendung_bei_einer_Markovquelle|Aufgabe 2.8]].
 +
 
 +
 
 +
{{GraueBox|TEXT=
 +
$\text{Beispiel 6:}$&nbsp; Gegeben sei eine gedächtnislose Binärquelle&nbsp; $(M = 2)$&nbsp; mit den Symbolen&nbsp; $\{$ $\rm X$,&nbsp;  $\rm Y \}$:
 +
*Die Symbolwahrscheinlichkeiten seien&nbsp; $p_{\rm X} = 0.8$ &nbsp;und&nbsp; $p_{\rm Y} = 0.2$.
 +
*Damit ergibt sich die Quellenentropie zu&nbsp; $H = 0.722$&nbsp; bit/Quellensymbol.
 +
*Wir betrachten die Symbolfolge&nbsp; $\{\rm XXXYXXXXXXXXYYXXXXXYYXXYXYXXYX\ \text{...} \}$&nbsp; mit nur wenigen&nbsp; $\rm Y$&ndash;Symbolen an den Positionen 4, 13, 14, ...
  
  
 
Der Huffman–Algorithmus kann auf diese Quelle direkt nicht angewendet werden, das heißt, man benötigt ohne weitere Maßnahme für jedes binäre Quellensymbol auch ein Bit. Aber:
 
Der Huffman–Algorithmus kann auf diese Quelle direkt nicht angewendet werden, das heißt, man benötigt ohne weitere Maßnahme für jedes binäre Quellensymbol auch ein Bit. Aber:
*Fasst man jeweils zwei binäre Symbole zu einem Zweiertupel ($k = 2$) entsprechend '''XX''' '''A''', '''XY''' '''B''', '''YX''' '''C''', '''YY''' '''D''' zusammen, so kann man „Huffman” auf die resultierende Folge '''ABAACADAABCBBAC'''...  mit $M′ = 4$ anwenden. Wegen
+
*Fasst man jeweils zwei binäre Symbole zu einem Zweiertupel&nbsp; $(k = 2)$&nbsp; entsprechend &nbsp; $\rm XX$ &nbsp; &nbsp; $\rm A$, &nbsp; $\rm XY$ &nbsp; &nbsp; $\rm B$, &nbsp; $\rm YX$ &nbsp; &nbsp; $\rm C$, &nbsp;  $\rm YY$ &nbsp; &nbsp; $\rm D$ &nbsp; zusammen, so kann man „Huffman” auf die resultierende Folge&nbsp; → &nbsp; $\rm ABAACADAABCBBAC$ ...&nbsp; → &nbsp; mit $M\hspace{-0.01cm}′ = 4$&nbsp; → &nbsp; anwenden. Wegen
 
   
 
   
 
:$$p_{\rm A}= 0.8^2 = 0.64 \hspace{0.05cm}, \hspace{0.2cm}p_{\rm B}= 0.8 \cdot 0.2 = 0.16 = p_{\rm C} \hspace{0.05cm}, \hspace{0.2cm}
 
:$$p_{\rm A}= 0.8^2 = 0.64 \hspace{0.05cm}, \hspace{0.2cm}p_{\rm B}= 0.8 \cdot 0.2 = 0.16 = p_{\rm C} \hspace{0.05cm}, \hspace{0.2cm}
 
p_{\rm D}= 0.2^2 = 0.04$$
 
p_{\rm D}= 0.2^2 = 0.04$$
  
:erhält man '''A''' 1, '''B''' → '''00''', '''C''' → '''011''', '''D''' → '''010''' sowie
+
:erhält man &nbsp; $\rm A$ &nbsp; → &nbsp; '''1''', &nbsp;  $\rm B$ &nbsp; &nbsp; '''00''', &nbsp;  $\rm C$ &nbsp; &nbsp; '''011''', &nbsp;  $\rm D$ &nbsp; &nbsp; '''010''' &nbsp; sowie
 
    
 
    
:$$L_{\rm M}' = 0.64 \cdot 1 + 0.16 \cdot 2 + 0.16 \cdot 3 + 0.04 \cdot 3 =1.56\,{\rm bit/Zweiertupel} $$
+
:$$L_{\rm M}\hspace{0.03cm}' = 0.64 \cdot 1 + 0.16 \cdot 2 + 0.16 \cdot 3 + 0.04 \cdot 3 =1.56\,{\rm bit/Zweiertupel} $$
  
:$$\Rightarrow\hspace{0.3cm}L_{\rm M} = {L_{\rm M}'}/{2}  = 0.78\,{\rm bit/Quellensymbol}\hspace{0.05cm}.$$
+
:$$\Rightarrow\hspace{0.3cm}L_{\rm M} = {L_{\rm M}\hspace{0.03cm}'}/{2}  = 0.78\ {\rm bit/Quellensymbol}\hspace{0.05cm}.$$
  
*Nun bilden wir Dreiertupel ($k = 3$) entsprechend '''XXX''' '''A''', '''XXY''' '''B''', '''XYX''' '''C''', '''XYY''' '''D''', '''YXX''' '''E''', '''YXY''' '''F''', '''YYX''' '''G''', '''YYY''' '''H'''.
+
*Nun bilden wir Dreiertupel&nbsp;  $(k = 3)$&nbsp; → &nbsp; entsprechend  
: Für die oben angegebene Eingangsfolge kommt man zur äquivalenten Folge '''AEBAGADBCC'''... (basierend auf dem neuen Symbolumfang $M′ = 8$) und zu folgenden Wahrscheinlichkeiten:
+
:&nbsp; &nbsp; &nbsp; $\rm XXX$ &nbsp; &nbsp; $\rm A$, &nbsp; $\rm XXY$ &nbsp; &nbsp; $\rm B$, &nbsp; $\rm XYX$ &nbsp; &nbsp; $\rm C$, &nbsp; $\rm XYY$ &nbsp; &nbsp; $\rm D$, &nbsp; $\rm YXX$ &nbsp; &nbsp; $\rm E$, &nbsp; $\rm YXY$ &nbsp; &nbsp; $\rm F$, &nbsp; $\rm YYX$ &nbsp; &nbsp; $\rm G$, &nbsp; $\rm YYY$ &nbsp; &nbsp; $\rm H$.
 +
 
 +
:Für die oben angegebene Eingangsfolge kommt man zur äquivalenten Folge&nbsp;  $\rm AEBAGADBCC$ ...&nbsp; (basierend auf dem neuen Symbolumfang $M\hspace{-0.01cm}′ = 8$) und zu folgenden Wahrscheinlichkeiten:
 
   
 
   
:$$p_{\rm A}= 0.8^3 = 0.512 \hspace{0.05cm}, \hspace{0.2cm}p_{\rm B}=  p_{\rm C}= p_{\rm E} = 0.8^2 \cdot 0.2 = 0.128\hspace{0.05cm},$$
+
:$$p_{\rm A}= 0.8^3 = 0.512 \hspace{0.05cm}, \hspace{0.5cm}p_{\rm B}=  p_{\rm C}= p_{\rm E} = 0.8^2 \cdot 0.2 = 0.128\hspace{0.05cm},\hspace{0.5cm}
:$$p_{\rm D}=  p_{\rm F}= p_{\rm G} = 0.8 \cdot 0.2^2 = 0.032 \hspace{0.05cm}, \hspace{0.2cm}p_{\rm H}=  0.2^3 = 0.008\hspace{0.05cm}.$$
+
p_{\rm D}=  p_{\rm F}= p_{\rm G} = 0.8 \cdot 0.2^2 = 0.032 \hspace{0.05cm}, \hspace{0.5cm}p_{\rm H}=  0.2^3 = 0.008\hspace{0.05cm}.$$
  
:Die Huffman–Codierung lautet somit: '''A''' → '''1''', '''B''' → '''011''', '''C''' → '''010''', '''D''' → '''00011''', '''E''' → '''001''', '''F''' → '''00010''', '''G''' → '''00001''', '''H''' → '''00000'''.  
+
:Die Huffman–Codierung lautet somit:  
 +
:&nbsp; &nbsp; &nbsp; $\rm A$ &nbsp; &nbsp; '''1''', &nbsp; $\rm B$ &nbsp; &nbsp; '''011''', &nbsp; $\rm C$ &nbsp; &nbsp; '''010''', &nbsp; $\rm D$ &nbsp; &nbsp; '''00011''', &nbsp; $\rm E$ &nbsp; &nbsp; '''001''', &nbsp; $\rm F$ &nbsp; &nbsp; '''00010''', &nbsp; $\rm G$ &nbsp; &nbsp; '''00001''', &nbsp; $\rm H$ &nbsp; &nbsp; '''00000'''.  
 
:Damit erhält man für die mittlere Codewortlänge:
 
:Damit erhält man für die mittlere Codewortlänge:
  
:$$L_{\rm M}' = 0.512 \cdot 1 + 3 \cdot 0.128 \cdot 3 + (3 \cdot 0.032 + 0.008)  \cdot 5 =2.184 \,{\rm bit/Dreiertupel} $$   
+
:$$L_{\rm M}\hspace{0.03cm}' = 0.512 \cdot 1 + 3 \cdot 0.128 \cdot 3 + (3 \cdot 0.032 + 0.008)  \cdot 5 =2.184 \,{\rm bit/Dreiertupel} $$   
  
:$$\Rightarrow\hspace{0.3cm}L_{\rm M} = {L_{\rm M}'}/{3}  = 0.728\,{\rm bit/Quellensymbol}\hspace{0.05cm}.$$
+
:$$\Rightarrow\hspace{0.3cm}L_{\rm M} = {L_{\rm M}\hspace{0.03cm}'}/{3}  = 0.728\ {\rm bit/Quellensymbol}\hspace{0.05cm}.$$
  
:In diesem Beispiel wird also bereits mit $k = 3$ die Quellenentropie $H = 0.722\ \rm bit/Quellensymbol$ fast erreicht.}}
+
:In diesem Beispiel wird also bereits mit&nbsp; $k = 3$&nbsp;  die Quellenentropie&nbsp; $H = 0.722$&nbsp; bit/Quellensymbol nahezu erreicht.}}
  
  
 
   
 
   
 
==Aufgaben zum Kapitel  ==  
 
==Aufgaben zum Kapitel  ==  
 +
<br>
 +
[[Aufgaben:Aufgabe_2.6:_Zur_Huffman-Codierung|Aufgabe 2.6: Zur Huffman-Codierung]]
  
[[Aufgaben:2.6 Huffman-Codierung|Aufgabe 2.6: &nbsp; Huffman-Codierung]]
+
[[Aufgaben:2.6Z Nochmals zum Huffman–Code|Aufgabe 2.6Z: Nochmals zum Huffman–Code]]
 
 
[[Aufgaben:2.6Z Nochmals zum Huffman–Code|Zusatzaufgabe 2.6Z: &nbsp; Nochmals zum Huffman–Code]]
 
  
[[Aufgaben:2.7 Zweiertupel - Huffman|Aufgabe 2.7: &nbsp; Zweiertupel - Huffman]]
+
[[Aufgaben:Aufgabe_2.7:_Huffman-Anwendung_für_binäre_Zweiertupel|Aufgabe 2.7: Huffman-Anwendung für binäre Zweiertupel]]
  
[[Aufgaben:2.7Z Ternärquelle-Zweiertupel|Zusatzaufgabe 2.7Z: &nbsp; Ternärquelle-Zweiertupel]]
+
[[Aufgaben:Aufgabe_2.7Z:_Huffman-Codierung_für_Zweiertupel_einer_Ternärquelle|Aufgabe 2.7Z: Huffman-Codierung für Zweiertupel einer Ternärquelle]]
  
[[Aufgaben:2.8 Markovquelle und Huffman|Aufgabe 2.8: &nbsp; Markovquelle und Huffman]]
+
[[Aufgaben:Aufgabe_2.8:_Huffman-Anwendung_bei_einer_Markovquelle|Aufgabe 2.8: Huffman-Anwendung bei einer Markovquelle]]
  
[[Aufgaben:2.9 Huffman-Decodierung nach Fehlern|Aufgabe 2.9: &nbsp; Huffman-Decodierung nach Fehlern]]
+
[[Aufgaben:2.9 Huffman-Decodierung nach Fehlern|Aufgabe 2.9: Huffman-Decodierung nach Fehlern]]
  
  
 
{{Display}}
 
{{Display}}

Aktuelle Version vom 6. Juli 2021, 16:34 Uhr

Der Huffman–Algorithmus


Wir setzen nun voraus, dass die Quellensymbole  $q_\nu$  einem Alphabet  $\{q_μ\} = \{$ $\rm A$,  $\rm B$ ,  $\rm C$ , ...$\}$  mit dem Symbolumfang  $M$  entstammen und statistisch voneinander unabhängig seien.  Beispielsweise gelte für den Symbolumfang  $M = 8$:

$$\{ \hspace{0.05cm}q_{\mu} \} = \{ \boldsymbol{\rm A} \hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm B}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm C}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm D}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm E}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm F}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm G}\hspace{0.05cm},\hspace{0.05cm} \boldsymbol{\rm H}\hspace{0.05cm} \}\hspace{0.05cm}.$$

David A. Huffman  hat 1952 – also kurz nach Shannons bahnbrechenden Veröffentlichungen – einen Algorithmus zur Konstruktion von optimalen präfixfreien Codes angegeben.  Dieser  Huffman–Algorithmus  soll hier ohne Herleitung und Beweis angegeben werden, wobei wir uns auf Binärcodes beschränken.  Das heißt:   Für die Codesymbole gelte stets  $c_ν ∈ \{$01$\}$.

Hier ist das „Rezept”:

  1.   Man ordne die Symbole nach fallenden Auftrittswahrscheinlichkeiten.
  2.   Man fasse die zwei unwahrscheinlichsten Symbole zu einem neuen Symbol zusammen.
  3.   Man wiederhole  (1)  und  (2), bis nur mehr zwei (zusammengefasste) Symbole übrig bleiben.
  4.   Man codiert die wahrscheinlichere Symbolmenge mit  1  und die andere Menge mit  0.
  5.   Man ergänzt in Gegenrichtung  (von unten nach oben)  die jeweiligen Binärcodes der aufgespaltenen Teilmengen gemäß den Wahrscheinlichkeiten mit  1  bzw.  0.


$\text{Beispiel 1:}$  Ohne Einschränkung der Allgemeingültigkeit setzen wir voraus, dass die  $M = 6$  Symbole  $\rm A$, ... , $\rm F$  bereits nach ihren Wahrscheinlichkeiten geordnet sind:

$$p_{\rm A} = 0.30 \hspace{0.05cm},\hspace{0.2cm}p_{\rm B} = 0.24 \hspace{0.05cm},\hspace{0.2cm}p_{\rm C} = 0.20 \hspace{0.05cm},\hspace{0.2cm} p_{\rm D} = 0.12 \hspace{0.05cm},\hspace{0.2cm}p_{\rm E} = 0.10 \hspace{0.05cm},\hspace{0.2cm}p_{\rm F} = 0.04 \hspace{0.05cm}.$$

Durch paarweises Zusammenfassen und anschießendes Sortieren erhält man in fünf Schritten die folgenden Symbolkombinationen
(resultierende Wahrscheinlichkeiten in Klammern):

1.   $\rm A$  (0.30), $\rm B$  (0.24), $\rm C$  (0.20), $\rm EF$  (0.14), $\rm D$  (0.12),
2.   $\rm A$  (0.30), $\rm EFD$  (0.26), $\rm B$  (0.24), $\rm C$  (0.20),
3.   $\rm BC$  (0.44), $\rm A$  (0.30), $\rm EFD$  (0.26),
4.   $\rm AEFD$  (0.56), $\rm BC$  (0.44),
5.   Root  $\rm AEFDBC$  (1.00).

Rückwärts – also gemäß den Schritten  (5)  bis  (1)  – erfolgt dann die Zuordnung zu Binärsymbolen. 
Ein  x  weist darauf hin, dass in den nächsten Schritten noch Bit hinzugefügt werden müssen:

5.   $\rm AEFD$   →   1x,     $\rm BC$   →   0x,
4.   $\underline{\rm A}$   →   11,     $\rm EFD$   →   10x,
3.   $\underline{\rm B}$   →   01,     $\underline{\rm C}$   →   00,
2.   $\rm EF$   →   101x,     $\underline{\rm D}$   →   100,
1.   $\underline{\rm E}$   →   1011,     $\underline{\rm F}$   →   1010.

Die Unterstreichungen markieren die endgültige Binärcodierung.


Zum Begriff „Entropiecodierung”


Wir gehen weiterhin von den Wahrscheinlichkeiten und Zuordnungen des letzten Beispiels aus:

$$p_{\rm A} = 0.30 \hspace{0.05cm},\hspace{0.2cm}p_{\rm B} = 0.24 \hspace{0.05cm},\hspace{0.2cm}p_{\rm C} = 0.20 \hspace{0.05cm},\hspace{0.2cm} p_{\rm D} = 0.12 \hspace{0.05cm},\hspace{0.2cm}p_{\rm E} = 0.10 \hspace{0.05cm},\hspace{0.2cm}p_{\rm F} = 0.04 \hspace{0.05cm};$$
$$\boldsymbol{\rm A} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 11} \hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm B} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 01} \hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm C} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 00} \hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm D} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 100} \hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm E} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 1011} \hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.05cm} \boldsymbol{\rm 1010} \hspace{0.05cm}.$$

Von den sechs Quellensymbolen werden also drei mit je zwei Bit, eines mit drei Bit und zwei Symbole  $(\rm E$  und  $\rm F)$  mit je vier Bit codiert.

Die mittlere Codewortlänge ergibt sich damit zu

$$L_{\rm M} = (0.30 \hspace{-0.05cm}+ \hspace{-0.05cm}0.24 \hspace{-0.05cm}+ \hspace{-0.05cm} 0.20) \cdot 2 + 0.12 \cdot 3 + (0.10 \hspace{-0.05cm}+ \hspace{-0.05cm} 0.04 ) \cdot 4 = 2.4 \,{\rm bit/Quellensymbol} \hspace{0.05cm}.$$

Aus dem Vergleich mit der Quellenentropie  $H = 2.365 \ \rm bit/Quellensymbol$  erkennt man die Effizienz der Huffman–Codierung.

$\text{Merke:}$  Es gibt keinen präfixfreien  $($⇒   sofort decodierbaren$)$  Code, der allein unter Ausnutzung der Auftrittswahrscheinlichkeiten zu einer kleineren mittleren Codewortlänge  $L_{\rm M}$  führt als der Huffman–Code.  In diesem Sinne ist der Huffman–Code optimal.


$\text{Beispiel 2:}$  Wären die Symbolwahrscheinlichkeiten

$$p_{\rm A} = p_{\rm B} = p_{\rm C} = 1/4 \hspace{0.05cm},\hspace{0.2cm} p_{\rm D} = 1/8 \hspace{0.05cm},\hspace{0.2cm}p_{\rm E} = p_{\rm F} = 1/16 \hspace{0.05cm},$$

so würde für die Entropie und für die mittlere Codewortlänge gleichermaßen gelten:

$$H = 3 \cdot 1/4 \cdot {\rm log_2}\hspace{0.1cm}(4) + 1/8 \cdot {\rm log_2}\hspace{0.1cm}(8) + 2 \cdot 1/16 \cdot {\rm log_2}\hspace{0.1cm}(16) = 2.375 \,{\rm bit/Quellensymbol}\hspace{0.05cm},$$
$$L_{\rm M} = 3 \cdot 1/4 \cdot 2 + 1/8 \cdot 3 + 2 \cdot 1/16 \cdot 4 = 2.375 \,{\rm bit/Quellensymbol} \hspace{0.05cm}.$$


Aus dieser Eigenschaft  $L_{\rm M} = H +\varepsilon$  mit positivem  $\varepsilon \to 0$  bei geeigneten Auftrittswahrscheinlichkeiten erklärt sich der Begriff  Entropiecodierung:

Man versucht bei dieser Form von Quellencodierung, die Länge  $L_μ$  der Binärfolge  (bestehend aus Nullen und Einsen)  für das Symbol  $q_μ$  gemäß der Entropieberechnung wie folgt an dessen Auftrittswahrscheinlichkeit  $p_μ$  anzupassen:

$$L_{\mu} = {\rm log}_2\hspace{0.1cm}(1/p_{\mu} ) \hspace{0.05cm}.$$

Natürlich gelingt das nicht immer, sondern nur dann, wenn alle Auftrittswahrscheinlichkeiten  $p_μ$  in der Form  $2^{–k}$  mit  $k = 1, \ 2, \ 3,$ ... dargestellt werden können.

  • In diesem Sonderfall – und nur in diesem – stimmt die mittlere Codewortlänge  $L_{\rm M}$  exakt mit der Quellenentropie  $H$  überein  $(\varepsilon = 0$,  siehe $\text{Beispiel 2})$.
  • Nach dem  Quellencodierungstheorem  gibt es keinen  (decodierbaren)  Code, der im Mittel mit weniger Binärzeichen pro Quellensymbol auskommt.


Darstellung des Huffman–Codes als Baumdiagramm


Häufig wird zur Konstruktion des Huffman–Codes eine  Baumstruktur  verwendet.  Für das bisher betrachtete Beispiel ist diese in der folgenden Grafik dargestellt:

Baumdarstellung der Huffman–Codierung für das  $\text{Beispiel 1}$

Man erkennt:

  • Bei jedem Schritt des Huffman–Algorithmus werden die beiden Zweige mit den jeweils kleinsten Wahrscheinlichkeiten zusammengefasst.
  • Der Knoten im ersten Schritt fasst die zwei Symbole  $\rm E$  und  $\rm F$  mit den aktuell kleinsten Wahrscheinlichkeiten zusammen.  Dieser neue Knoten ist mit  $p_{\rm E} + p_{\rm F} = 0.14$  beschriftet.
  • Der vom Symbol mit der kleineren Wahrscheinlichkeit  $($hier  $\rm F)$  zum Summenknoten verlaufende Zweig ist blau eingezeichnet, der andere Zweig  $($für $\rm E)$  rot.
  • Nach fünf Schritten ist man bei der Baumwurzel  („Root”)  mit der Gesamtwahrscheinlichkeit  $1.00$  angelangt. 


Verfolgt man nun den Verlauf von der Wurzel  (in obiger Grafik mit gelber Füllung)  zu den einzelnen Symbolen zurück, so kann man aus den Farben der einzelnen Zweige die Symbolzuordnung ablesen.

Mit den Zuordnungen „rot”   →   1  und „blau”   →   0  ergibt sich beispielsweise von der Wurzel zu Symbol

  • $\rm A$:   rot, rot   →   11,
  • $\rm B$:   blau, rot   →   01,
  • $\rm C$:   blau, blau   →   00,
  • $\rm D$:   rot, blau, blau   →   100,
  • $\rm E$:   rot, blau, rot, rot   →   1011,
  • $\rm F$:   rot, blau, rot, blau   →   1010.


Die  (einheitliche)  Zuordnung „rot”   →   0 und „blau”   →   1 würde ebenfalls zu einem optimalen präfixfreien Huffman–Code führen.

$\text{Beispiel 3:}$  Die folgende Grafik zeigt die Huffman–Codierung von  $49$  Symbolen  $q_ν ∈ \{$ $\rm A$,  $\rm B$,  $\rm C$,  $\rm D$,  $\rm E$,  $\rm F$ $\}$  mit der auf der letzten Seite hergeleiteten Zuordnung.

Beispielfolgen bei Huffman–Codierung
  • Die binäre Codesymbolfolge weist die mittlere Codewortlänge  $L_{\rm M} = 125/49 = 2.551$  auf. 
  • Die verschiedenen Farben dienen ausschließlich zur besseren Orientierung.
  • Aufgrund der kurzen Quellensymbolfolge  $(N = 49)$  weichen die Auftrittshäufigkeiten  $h_{\rm A}$, ... ,  $h_{\rm F}$  der simulierten Folgen (manchmal) signifikant von den gegebenen Wahrscheinlichkeiten  $p_{\rm A}$, ... ,  $p_{\rm F}$  ab:
$$p_{\rm A} = 0.30 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm A} = 16/49 \approx 0.326 \hspace{0.05cm},$$
$$p_{\rm B} = 0.24 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm B} = 7/49 \approx 0.143 \hspace{0.05cm},$$
$$p_{\rm C} =0.24 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm C}= 9/49 \approx 0.184 \hspace{0.05cm},$$
$$p_{\rm D} = 0.12 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm D} = 7/49 \approx 0.143 \hspace{0.05cm},$$
$$p_{\rm E}=0.10 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm E} = 5/49 \approx 0.102 \hspace{0.05cm},$$
$$p_{\rm F} = 0.04 \hspace{0.05cm} \Rightarrow \hspace{0.05cm} h_{\rm E} = 5/49 \approx 0.102 \hspace{0.05cm}.$$
  • Damit ergibt sich ein etwas größerer Entropiewert:
$$H ({\rm bez\ddot{u}glich }\hspace{0.15cm}p_{\mu}) = 2.365 \ {\rm bit/Quellensymbol}\hspace{0.3cm} \Rightarrow \hspace{0.3cm} H ({\rm bez\ddot{u}glich }\hspace{0.15cm}h_{\mu}) = 2.451 \ {\rm bit/Quellensymbol} \hspace{0.05cm}.$$
Würde man den Huffman–Code mit diesen „neuen Wahrscheinlichkeiten”  $h_{\rm A}$, ... , $h_{\rm F}$  bilden, so ergäben sich folgende Zuordnungen:
     $\boldsymbol{\rm A} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$11$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm B} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$100$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm C} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$00$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm D} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$101$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm E} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$010$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$011$\hspace{0.05cm}.$
Nun würden nur  $\rm A$  und  $\rm C$  mit zwei Bit dargestellt, die anderen vier Symbole durch jeweils drei Bit.
  • Die Codesymbolfolge hätte dann eine Länge von  $(16 + 9) · 2 + (7 + 7 + 5 + 5) · 3 = 122$  Bit, wäre also um drei Bit kürzer als nach der bisherigen Codierung.
  • Die mittlere Codewortlänge wäre dann  $L_{\rm M} = 122/49 ≈ 2.49$  bit/Quellensymbol  anstelle von  $L_{\rm M}≈ 2.55$  bit/Quellensymbol.


Das folgende interaktive Applet  (in zwei Versionen)  verdeutlicht die Vorgehensweise bei zwei Varianten einer Entropiecodierung.


$\text{Fazit:}$  Dieses Beispiel lässt sich wie folgt interpretieren:

  • Die Huffman–Codierung lebt von der  (genauen)  Kenntnis der Symbolwahrscheinlichkeiten.  Sind diese sowohl dem Sender als auch dem Empfänger bekannt, so ist die mittlere Codewortlänge  $L_{\rm M}$  oft nur unwesentlich größer als die Quellenentropie  $H$.
  • Insbesondere bei kleinen Dateien kann es zu Abweichungen zwischen den  (erwarteten)  Symbolwahrscheinlichkeiten  $p_μ$  und den  (tatsächlichen)  Häufigkeiten  $h_μ$  kommen.  Besser wäre es hier, für jede Datei einen eigenen Huffman–Code zu generieren, der auf den tatsächlichen Gegebenheiten  $(h_μ)$  basiert.
  • In diesem Fall muss aber dem Decoder auch der spezifische Huffman–Code mitgeteilt werden.  Dies führt zu einem gewissen Overhead, der nur wieder bei längeren Dateien vernachlässigt werden kann.  Bei kleinen Dateien lohnt sich dieser Aufwand nicht.


Einfluss von Übertragungsfehlern auf die Decodierung


Der Huffman–Code ist aufgrund der Eigenschaft „präfixfrei” verlustlos.

  • Das bedeutet:   Aus der binären Codesymbolfolge lässt sich die Quellensymbolfolge vollständig rekonstruieren.
  • Kommt es aber bei der Übertragung zu einem Fehler  $($aus einer  0  wird eine  1  bzw. aus einer  1  eine  0$)$,  so stimmt natürlich auch die Sinkensymbolfolge  $〈v_ν〉$  nicht mit der Quellensymbolfolge  $〈q_ν〉$  überein.


Die beiden folgenden Beispiele zeigen, dass ein einziger Übertragungsfehler manchmal eine Vielzahl von Fehlern hinsichtlich des Ursprungstextes zur Folge haben kann.

$\text{Beispiel 4:}$  Wir betrachten die gleiche Quellensymbolfolge und den gleichen Huffman–Code wie auf der vorherigen Seite.

Zum Einfluss von Übertragungsfehlern bei Huffman–Codierung
  • Die obere Grafik zeigt, dass bei fehlerfreier Übertragung aus der codierten Binärfolge  111011...  wieder die ursprüngliche Quellenfolge  $\rm AEBFCC$...  rekonstruiert werden kann.
  • Wird aber zum Beispiel das Bit 6 verfälscht  $($von  1  auf  0, rote Markierung in der mittlere Grafik$)$, so wird aus dem Quellensymbol  $q_2 = \rm E$  das Sinkensymbol  $v_2 =\rm F$.
  • Eine Verfälschung von Bit 13  $($von  0  auf  1, rote Markierung in der unteren Grafik$)$  führt sogar zu einer Verfälschung von vier Quellensymbolen:   $\rm CCEC$  →  $\rm DBBD$.


$\text{Beispiel 5:}$  Eine zweite Nachrichtenquelle mit Symbolumfang  $M = 6$  sei durch folgende Symbolwahrscheinlichkeiten gekennzeichnet:

$$p_{\rm A} = 0.50 \hspace{0.05cm},\hspace{0.2cm}p_{\rm B} = 0.19 \hspace{0.05cm},\hspace{0.2cm}p_{\rm C} = 0.11 \hspace{0.05cm},\hspace{0.2cm} p_{\rm D} = 0.09 \hspace{0.05cm},\hspace{0.2cm}p_{\rm E} = 0.06 \hspace{0.05cm},\hspace{0.2cm}p_{\rm F} = 0.05 \hspace{0.05cm}.$$

Hier führt der Huffman–Algorithmus zu folgender Zuordnung:

     $\boldsymbol{\rm A} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$0$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm B} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$111$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm C} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$101$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm D} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$100$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm E} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$1101$\hspace{0.05cm},\hspace{0.2cm} \boldsymbol{\rm F} \hspace{0.05cm} \rightarrow \hspace{0.15cm}$1100$\hspace{0.05cm}.$
Zur Fehlerfortpflanzung der Huffman–Codierung


Die Quellensymbolfolge  $\rm ADABD$...  (siehe Grafik) wird somit durch die Codesymbolfolge  0'100'0'111'100' ...  dargestellt.  Die Hochkommata dienen hierbei lediglich der Orientierung für den Leser.

Bei der Übertragung wird nun das erste Bit verfälscht:  Anstelle von  01000111100...  empfängt man somit  11000111100...

  • Aus den beiden ersten Quellensymbolen  $\rm AD$  →  0100  wird nach der Decodierung das Sinkensymbol  $\rm F$  →  1100.
  • Die weiteren Symbole werden dann wieder richtig detektiert, aber nun nicht mehr beginnend bei der Position  $ν = 3$, sondern bei  $ν = 2$.


Je nach Anwendung sind die Auswirkungen unterschiedlich:

  • Handelt es sich bei der Quelle um einen natürlichen Text und bei der Sinke um einen Menschen, so bleibt der Großteil des Textes für den Leser verständlich.
  • Ist die Sinke jedoch ein Automat, der sukzessive alle  $v_ν$  mit den entsprechenden  $q_ν$  vergleicht, so ergibt sich eine Verfälschungshäufigkeit von deutlich über  $50\%$.
  • Nur die blauen Symbole der Sinkensymbolfolge  $〈v_ν〉$  stimmen dann (zufällig) mit den Quellensymbolen  $q_ν$  überein, während rote Symbole auf Fehler hinweisen.


Anwendung der Huffman–Codierung auf  $k$–Tupel


Der Huffman–Algorithmus in seiner Grundform liefert dann unbefriedigende Ergebnisse, wenn

  • eine Binärquelle  $(M = 2)$  vorliegt, zum Beispiel mit dem Symbolvorrat  $\{$ $\rm X$,  $\rm Y$ $\}$,
  • es statistische Bindungen zwischen den Symbolen der Eingangsfolge gibt,
  • die Wahrscheinlichkeit des häufigsten Symbols deutlich größer ist als  $50\%$.


Abhilfe schafft man in diesen Anwendungsfällen,

  • in dem man mehrere Symbole zusammenfasst, und
  • den Huffman–Algorithmus auf einen neuen Symbolvorrat  $\{$ $\rm A$,  $\rm B$, $\rm C$,  $\rm D$, ... $\}$  anwendet.


Bildet man  $k$–Tupel, so steigt der Symbolumfang von  $M$  auf  $M\hspace{-0.01cm}′ = M^k$.

Wir wollen im folgenden Beispiel die Vorgehensweise anhand einer Binärquelle verdeutlichen.  Weitere Beispiele finden Sie in


$\text{Beispiel 6:}$  Gegeben sei eine gedächtnislose Binärquelle  $(M = 2)$  mit den Symbolen  $\{$ $\rm X$,  $\rm Y \}$:

  • Die Symbolwahrscheinlichkeiten seien  $p_{\rm X} = 0.8$  und  $p_{\rm Y} = 0.2$.
  • Damit ergibt sich die Quellenentropie zu  $H = 0.722$  bit/Quellensymbol.
  • Wir betrachten die Symbolfolge  $\{\rm XXXYXXXXXXXXYYXXXXXYYXXYXYXXYX\ \text{...} \}$  mit nur wenigen  $\rm Y$–Symbolen an den Positionen 4, 13, 14, ...


Der Huffman–Algorithmus kann auf diese Quelle direkt nicht angewendet werden, das heißt, man benötigt ohne weitere Maßnahme für jedes binäre Quellensymbol auch ein Bit. Aber:

  • Fasst man jeweils zwei binäre Symbole zu einem Zweiertupel  $(k = 2)$  entsprechend   $\rm XX$   →   $\rm A$,   $\rm XY$   →   $\rm B$,   $\rm YX$   →   $\rm C$,   $\rm YY$   →   $\rm D$   zusammen, so kann man „Huffman” auf die resultierende Folge  →   $\rm ABAACADAABCBBAC$ ...  →   mit $M\hspace{-0.01cm}′ = 4$  →   anwenden. Wegen
$$p_{\rm A}= 0.8^2 = 0.64 \hspace{0.05cm}, \hspace{0.2cm}p_{\rm B}= 0.8 \cdot 0.2 = 0.16 = p_{\rm C} \hspace{0.05cm}, \hspace{0.2cm} p_{\rm D}= 0.2^2 = 0.04$$
erhält man   $\rm A$   →   1,   $\rm B$   →   00,   $\rm C$   →   011,   $\rm D$   →   010   sowie
$$L_{\rm M}\hspace{0.03cm}' = 0.64 \cdot 1 + 0.16 \cdot 2 + 0.16 \cdot 3 + 0.04 \cdot 3 =1.56\,{\rm bit/Zweiertupel} $$
$$\Rightarrow\hspace{0.3cm}L_{\rm M} = {L_{\rm M}\hspace{0.03cm}'}/{2} = 0.78\ {\rm bit/Quellensymbol}\hspace{0.05cm}.$$
  • Nun bilden wir Dreiertupel  $(k = 3)$  →   entsprechend
      $\rm XXX$   →   $\rm A$,   $\rm XXY$   →   $\rm B$,   $\rm XYX$   →   $\rm C$,   $\rm XYY$   →   $\rm D$,   $\rm YXX$   →   $\rm E$,   $\rm YXY$   →   $\rm F$,   $\rm YYX$   →   $\rm G$,   $\rm YYY$   →   $\rm H$.
Für die oben angegebene Eingangsfolge kommt man zur äquivalenten Folge  $\rm AEBAGADBCC$ ...  (basierend auf dem neuen Symbolumfang $M\hspace{-0.01cm}′ = 8$) und zu folgenden Wahrscheinlichkeiten:
$$p_{\rm A}= 0.8^3 = 0.512 \hspace{0.05cm}, \hspace{0.5cm}p_{\rm B}= p_{\rm C}= p_{\rm E} = 0.8^2 \cdot 0.2 = 0.128\hspace{0.05cm},\hspace{0.5cm} p_{\rm D}= p_{\rm F}= p_{\rm G} = 0.8 \cdot 0.2^2 = 0.032 \hspace{0.05cm}, \hspace{0.5cm}p_{\rm H}= 0.2^3 = 0.008\hspace{0.05cm}.$$
Die Huffman–Codierung lautet somit:
      $\rm A$   →   1,   $\rm B$   →   011,   $\rm C$   →   010,   $\rm D$   →   00011,   $\rm E$   →   001,   $\rm F$   →   00010,   $\rm G$   →   00001,   $\rm H$   →   00000.
Damit erhält man für die mittlere Codewortlänge:
$$L_{\rm M}\hspace{0.03cm}' = 0.512 \cdot 1 + 3 \cdot 0.128 \cdot 3 + (3 \cdot 0.032 + 0.008) \cdot 5 =2.184 \,{\rm bit/Dreiertupel} $$
$$\Rightarrow\hspace{0.3cm}L_{\rm M} = {L_{\rm M}\hspace{0.03cm}'}/{3} = 0.728\ {\rm bit/Quellensymbol}\hspace{0.05cm}.$$
In diesem Beispiel wird also bereits mit  $k = 3$  die Quellenentropie  $H = 0.722$  bit/Quellensymbol nahezu erreicht.


Aufgaben zum Kapitel


Aufgabe 2.6: Zur Huffman-Codierung

Aufgabe 2.6Z: Nochmals zum Huffman–Code

Aufgabe 2.7: Huffman-Anwendung für binäre Zweiertupel

Aufgabe 2.7Z: Huffman-Codierung für Zweiertupel einer Ternärquelle

Aufgabe 2.8: Huffman-Anwendung bei einer Markovquelle

Aufgabe 2.9: Huffman-Decodierung nach Fehlern