1.2 Kraft-McMillan-Ungleichung

Wir hatten eine binäre Codierung einer Menge X definiert als Funktion C:X{0,1}. In diesem Teilkapitel interessieren wir uns nur für das Bild dieser Funktion, also die Menge der Codewörter. Wir betrachten daher einen Code als endliche Menge C{0,1}. Er ist präfixfrei wenn x⪯̸y für alle x,yC,xy gilt. Die Kraft-McMillan-Ungleichung, die wir in diesem Kapitel zeigen werden, wird leicht verständlich, wenn wir uns präfixfreie Codes als Binärbäume vorstellen.

Theorem 1.2.1 (Kraft-McMillan-Ungleichung). Sei C{0,1} ein präfixfreier Code. Dann gilt

(1)cC2|c|1 .

Umgekehrt gilt: wenn l1,,ln natürliche Zahlen sind mit

i=1n2li1 ,

dann gibt es einen präfixfreien Code {c1,,cn} mit |ci|=li.

Beweis. Für den ersten Teil setzen wir l:=max{|c| | cC}, also die Länge des längsten Codeworts in C. Für jedes cC definieren wir die Menge

Xc:={x{0,1}l | cx}

In Worten: Xc ist die Menge, die wir erhalten, wenn wir alle Möglichkeiten betrachten, c zu einem String der Länge l zu erweitern. Die Schranke folgt aus zwei einfachen Beobachtungen über die Mengen Xc:

  1. |Xc|=2l|c|. Das gilt, weil es noch l|c| Stellen "aufzufüllen" gibt, um die Länge l zu erreichen.
  2. Die Mengen Xc sind paarweise disjunkt: wenn xXcXc sein sollte, dann sind cx und cx beides Präfixe von x. Wenn nun ohne Beschränkung der Allgemeinheit |c||c| gilt, so muss auch cc gelten: c muss also ein Präfix von c sein. Da C präfixfrei ist, geht das nur, wenn c=c ist. Die Mengen Xc sind also paarweise disjunkt.

Da {0,1}lcCXc gilt, folgt aus den beiden Beobachtungen

2l|cCXc|(weil paarweise disjunkt)=cC|Xc|(Wegen Punkt 1 oben.)=cC2l|c| .

Wenn wir beide Seiten durch 2l dividieren, erhalten wir cC2|c|1, wie behauptet. Somit haben wir den ersten Teil der Kraft-McMillan-Ungleichung gezeigt.

Alternativer Beweis. Falls Ihnen das zu schnell ging, können wir uns einen Binärbaum der Tiefe l:=max{|c| | cC} vorstellen und für jeden inneren Knoten die linke ausgehende Kante mit 0 und die rechte mit 1 beschriften. Somit entspricht jeder Knoten v nun einem String x{0,1} von Länge höchstens l, nämlich entsprechend den Labels auf den Kanten vom Wurzelknoten zu v; die Wurzel selbst trägt den leeren String ϵ. Wir können nun einen präfixfreien Code C als Menge von Knoten darstellen, die "unabhängig" ist, in der also kein Knoten Vorfahre eines anderen ist. Der Code

C={11,001,010,100,0001,0111}

entspricht der Menge der rot markierten Knoten:

Wir löschen nun alle Knoten, die einen roten Knoten als echten Vorfahren haben. Da keine zwei roten Knoten Vorfahren voneinander sind, wird dabei kein roter Knoten selbst gelöscht:

Dies ist ein vollständiger Binärbaum T. Da jeder rote Knoten ein Blatt von T ist, es aber womöglich weitere Blätter gibt, so gilt

cC2|c|b:Blatt von T2depth(b,T) .

Es bleibt zu zeigen, dass letztere Summe gleich 1 ist:

Behauptung 1.2.2 Sei T ein vollständiger Binärbaum. Dann gilt

b:Blatt von T2depth(b,T)=1 .

Beweis. Wir könnten uns einfach klar machen, dass ein Zufallslauf, der bei der Wurzel beginnt und immer zufällig eines der beiden Kinder nimmt, bis er ein Blatt erreicht, natürlich nach Definition immer ein Blatt erreicht, und zwar das Blatt b genau mit Wahrscheinlichkeit 2depth(b,T). Somit definiert er eine Wahrscheinlichkeitsverteilung auf den Blättern und die Behauptung folgt unmittelbar.

Wenn Ihnen das zu schnell ging, so können wir gerne einen Beweis per Induktion über die Struktur von T führen. Wenn T aus einem einzelnen Knoten b besteht, dann gilt depth(b,T)=0 und somit ist die Summe gleich 1.

Für den Induktionsschritt bezeichne r die Wurzel von T und TL,TR den linken bzw. rechten Teilbaum von T. Es gilt

(2)b:Blatt von T2depth(b,T)=b:Blatt von TL2depth(b,T)+b:Blatt von TR2depth(b,T)

Für ein Blatt b in TL gilt depth(b,T)=depth(b,TL)+1; analog für TR. Somit ist

(2)=b:Blatt von TL2depth(b,TL)1+b:Blatt von TR2depth(b,T)1=12b:Blatt von TL2depth(b,TL)+12b:Blatt von TR2depth(b,TR)

Nach Induktionshypothese ist jede der beiden Summen in der letzten Zeile gleich 1, und somit ist auch der Gesamtausdruck gleich 1.

Beweis des zweiten Teils. Wir nehmen an, dass die vorgegebenen Längen aufsteigend sortiert sind: l1l2ln. Wir nehmen nun einen vollständigen Binärbaum der Tiefe ln und färben alle Knoten weiß. Dann gehen wir die gewünschten Längen li von klein nach groß durch: für jedes li nehmen wir einen beliebigen weißen Knoten vi von Tiefe i und setzen das Codewort ci auf das Label von vi (das sich durch die Kantenlabel ergibt, wenn wir von der Wurzel nach vi laufen). Dann färben wir vi blau und löschen wir alle echten Nachfahren von vi.

Das einzige, was wir prüfen müssen ist, dass wir in jedem Schritt einen weißen Knoten vi von Tiefe li finden. Das ist der Fall: anfangs hat der Baum 2ln Blätter, alle weiß; wenn wir einen Knoten vi für ci auswählen, dann verschwinden 2lnli weiße Blätter, falls vi selbst keine Blatt ist; falls vi ein Blatt ist, also li=ln, dann wird vi blau gefärbt; in jedem Fall nimmt die Anzahl der weißen Blätter um 2lnli ab. Nach k Schritten ist die Anzahl der weißen Blätter also

2lni=1k2lnlk=2ln(1i=1k2li)(3) 2ln(i=k+1n2li) ,

da nach Annahme i=1n2li1 gilt; weiße Blätter übrig. Wenn k=n ist sind wir fertig; wenn k<n ist, dann ist (???) größer als 0, also gibt es noch ein weißes Blatt; somit hat dieses Blatt auch einen weißen Vorfahren auf Tiefe k+1 und wir können einen passenden Knoten vk+1 finden.