Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 1

Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 1 Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 1

www2.fh.rosenheim.de
von www2.fh.rosenheim.de Mehr von diesem Publisher
30.11.2012 Aufrufe

1-56 Aufgaben und Lösungen 3.4 Datenkompression Aufgabe 3.4.1 (T1) Warum führt die LZW-Kompression in der Regel zu einer stärkeren Redundanz-Minimierung als das Huffman-Verfahren? Lösung Beim Huffman-Verfahren werden nur Einzelzeichen codiert, beim LZW-Verfahren dagegen Zeichengruppen. Dadurch werden auch bedingte Auftrittswahrscheinlichkeiten bzw. Korrelationen berücksichtigt, so dass in Nachrichten, die solche Korrelationen enthalten, eine weitere Redundanzminimierung erricht wird. Aufgabe 3.4.2 (T1) Ordnen Sie die folgenden fünf Kompressionsverfahren den fünf unten angegebenen Datentypen zu, für welche sie am besten geeignet sind: MPEG, JPEG, LZW, RLC (Run Length Code), PDC (Prädiktive Differenzcodierung) Videofilm Computerprogramm CAD-Strichzeichnung Mit einer Digitalkamera aufgenommenes Foto Temperaturmesswerte mit 100 Messungen/sec Lösung Videofilm MPEG Computerprogramm LZW CAD-Strichzeichnung RLC Mit einer Digitalkamera aufgenommenes Foto JPEG Temperaturmesswerte mit 100 Messungen/sec PDC Aufgabe 3.4.3 (L3) Komprimieren Sie das Wort HUMUHUMUNUKUNUKUAPUAA (ein nach einem Fischchen benannter Cocktail aus Hawaii) mit arithmetischer und LZW-Kompression. Lösung a) Arithmetische Kompression Der Quelltext HUMUHUMUNUKUNUKUAPUAA ist arithmetisch zu codieren. Dazu werden zunächst die Auftrittswahrscheinlichkeiten wi der Einzelzeichen xi ermittelt. Danach wird jedem Zeichen ein Intervall [ug, og[ mit zum Intervall gehöriger Untergrenze ug und nicht mehr zum Intervall gehöriger Obergrenze og zugeordnet, dessen Länge zu der entsprechenden Auftrittswahrscheinlichkeit proportional ist. Man erhält folgende Tabelle: Zeichen Auftrittswahrscheinlichkeit Intervall c wi [ug, og[ _________________________________________________________________________________________ A 3/21 [0.000000000000000, 0.142857142847143[ H 2/21 [0.142857142847143, 0.238095238095238[ K 2/21 [0.238095238095238, 0.333333333333333[ M 2/21 [0.333333333333333, 0.428571428571429[

Aufgaben und Lösungen 1-57 N 2/21 [0.428571428571429, 0.523809523809524[ P 1/21 [0.523809523809524, 0.571428571428571[ U 9/21 [0.571428571428571, 1.000000000000000[ Zur eigentlichen Codierung wird als Startwert das Intervall [0.0, 1.0[ mit der Untergrenze ug=0.0 und der (nicht mehr zum Intervall gehörenden) Obergrenze og=1.0 hergenommen. Die Länge des Intervalls ist len=og-ug=1.0. Die Untergrenze und die Obergrenze dieses Intervalls werden nun durch die Schritt für Schritt eingelesenen Zeichen des Textes entsprechend der Unter- und Obergrenze ihres Intervalls immer weiter eingegrenzt. Dies geschieht durch Berechnung immer neuer, monoton wachsender Untergrenzen und monoton fallender Obergrenzen nach folgendem Schema: Setze ug = 0 und og = 1 Lies nächstes Eingabezeichen c und berechne: len = og - ug aktuelle Länge des Intervalls og = ug + len * og(c) neue Obergrenze, og(c) aus Tabelle ug = ug + len * ug(c) neue Untergrenze, ug(c) aus Tabelle bis das Textende erreicht ist Gib (ug+og)/2 als Ergebnis x aus. Damit geschieht die Kompression Schritt für Schritt wie folgt: Eingabezeichen c len ug og ______________________________________________________________________________________________________________________ Initialisierung 1.000000000000000 0.000000000000000 1.000000000000000 H 1.000000000000000 0.142857142857143 0.238095238095238 U 0.095238095238095 0.197278911564626 0.238095238095238 M 0.040816326530612 0.210884353741497 0.214771622934888 U 0.003887269193392 0.213105650423435 0.214771622934888 H 0.001665972511454 0.213343646496499 0.213502310545209 U 0.000158664048710 0.213434311667191 0.213502310545209 M 0.000067998878019 0.213456977959864 0.213463454043484 U 0.000006476083621 0.213460678579076 0.213463454043484 N 0.000002775464409 0.213461868063822 0.213462132393766 U 0.000000264329944 0.213462019109504 0.213462132393766 K 0.000000113284262 0.213462046081948 0.213462056870925 U 0.000000010788977 0.213462052247077 0.213462056870925 N 0.000000004623847 0.213462054228726 0.213462054669093 U 0.000000000440366 0.213462054480364 0.213462054669093 K 0.000000000188728 0.213462054525300 0.213462054543274 U 0.000000000017974 0.213462054535571 0.213462054543274 A 0.000000000007703 0.213462054535571 0.213462054536671 P 0.000000000001100 0.213462054536147 0.213462054536199 U 0.000000000000052 0.213462054536177 0.213462054536199 A 0.000000000000022 0.213462054536177 0.213462054536180 A 0.000000000000003 0.213462054536177 0.213462054536177 Das Ergebnis lautet also: x = 0.213462054536177. Es sind also 15 Dezimalstellen erforderlich, eine im Vergleich zu den ursprünglich 21 Zeichen erhebliche Kompressionsleistung, zumal die Dezimalstellen als Block-Code mit weniger Bit darstellbar sind als das Ausgangsalphabet der ASCII-Zeichen. In einem professionellen Programm würde man natürlich Hexadezimalziffern statt Dezimalziffern verwenden, so dass die Darstellung noch etwas komprimierter wäre und 4 Bit pro Ziffer für die Codierung genügen. Dazu kommt allerdings, dass die Häufigkeiten der Einzelzeichen ebenfalls mit übertragen werden müssen, da diese für die Dekompression erforderlich sind. Aus dem codierten Text, also der Gleitpunktzahl x=0.213462054536177, kann der Ursprungstext durch Umkehrung des Kompressionsalgorithmus wie folgt wieder gewonnen werden.

Aufgaben und <strong>Lösungen</strong> 1-57<br />

N 2/21 [0.428571428571429, 0.523809523809524[<br />

P 1/21 [0.523809523809524, 0.571428571428571[<br />

U 9/21 [0.571428571428571, 1.000000000000000[<br />

Zur eigentlichen Codierung wird als Startwert das Intervall [0.0, 1.0[ <strong>mit</strong> der Untergrenze<br />

ug=0.0 und der (nicht mehr zum Intervall gehörenden) Obergrenze og=1.0 hergenommen. Die<br />

Länge des Intervalls ist len=og-ug=1.0. Die Untergrenze und die Obergrenze dieses Intervalls<br />

werden nun durch die Schritt für Schritt eingelesenen Zeichen des Textes entsprechend der<br />

Unter- und Obergrenze ihres Intervalls immer weiter eingegrenzt. Dies geschieht durch Berechnung<br />

immer neuer, monoton wachsender Untergrenzen und monoton fallender Obergrenzen<br />

nach folgendem Schema:<br />

Setze ug = 0 und og = 1<br />

Lies nächstes Eingabezeichen c und berechne:<br />

len = og - ug aktuelle Länge des Intervalls<br />

og = ug + len * og(c) neue Obergrenze, og(c) aus Tabelle<br />

ug = ug + len * ug(c) neue Untergrenze, ug(c) aus Tabelle<br />

bis das Textende erreicht ist<br />

Gib (ug+og)/2 als Ergebnis x aus.<br />

Da<strong>mit</strong> geschieht die Kompression Schritt für Schritt wie folgt:<br />

Eingabezeichen c len ug og<br />

______________________________________________________________________________________________________________________<br />

Initialisierung 1.000000000000000 0.000000000000000 1.000000000000000<br />

H 1.000000000000000 0.142857142857143 0.238095238095238<br />

U 0.095238095238095 0.197278911564626 0.238095238095238<br />

M 0.040816326530612 0.210884353741497 0.214771622934888<br />

U 0.003887269193392 0.213105650423435 0.214771622934888<br />

H 0.001665972511454 0.213343646496499 0.213502310545209<br />

U 0.000158664048710 0.213434311667191 0.213502310545209<br />

M 0.000067998878019 0.213456977959864 0.213463454043484<br />

U 0.000006476083621 0.213460678579076 0.213463454043484<br />

N 0.000002775464409 0.213461868063822 0.213462132393766<br />

U 0.000000264329944 0.213462019109504 0.213462132393766<br />

K 0.000000113284262 0.213462046081948 0.213462056870925<br />

U 0.000000010788977 0.213462052247077 0.213462056870925<br />

N 0.000000004623847 0.213462054228726 0.213462054669093<br />

U 0.000000000440366 0.213462054480364 0.213462054669093<br />

K 0.000000000188728 0.213462054525300 0.213462054543274<br />

U 0.000000000017974 0.213462054535571 0.213462054543274<br />

A 0.000000000007703 0.213462054535571 0.213462054536671<br />

P 0.000000000001100 0.213462054536147 0.213462054536199<br />

U 0.000000000000052 0.213462054536177 0.213462054536199<br />

A 0.000000000000022 0.213462054536177 0.213462054536180<br />

A 0.000000000000003 0.213462054536177 0.213462054536177<br />

Das Ergebnis lautet also: x = 0.213462054536177. Es sind also 15 Dezimalstellen erforderlich,<br />

eine im Vergleich zu den ursprünglich 21 Zeichen erhebliche Kompressionsleistung, zumal<br />

die Dezimalstellen als Block-Code <strong>mit</strong> weniger Bit darstellbar sind als das Ausgangsalphabet<br />

der ASCII-Zeichen. In einem professionellen Programm würde man natürlich Hexadezimalziffern<br />

statt Dezimalziffern verwenden, so dass die Darstellung noch etwas komprimierter<br />

wäre und 4 Bit pro Ziffer für die Codierung genügen. Dazu kommt allerdings, dass die Häufigkeiten<br />

der Einzelzeichen ebenfalls <strong>mit</strong> übertragen werden müssen, da diese für die Dekompression<br />

erforderlich sind.<br />

Aus dem codierten Text, also der Gleitpunktzahl x=0.213462054536177, kann der Ursprungstext<br />

durch Umkehrung des Kompressionsalgorithmus wie folgt wieder gewonnen werden.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!