Technische Universität München SS 2006 Fakultät für Informatik Übungsblatt 3 Prof. Dr. A. Knoll 2. Juni 2006

Ähnliche Dokumente
Computer Science Unplugged Algorithmen zur Textkompression

Java - Programmierung - Prozedurale Programmierung 1

Programmieren in Java

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Technische Universität München WiSe 2018/19 Fakultät für Informatik Übungsblatt 6 Dr. Ch. Herzog 26. November 2018

System.out.println("TEXT");

Übung Algorithmen und Datenstrukturen

Technische Universität München SS 2006 Fakultät für Informatik Übungsblatt 4 Prof. Dr. A. Knoll 16. Juni 2006

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Selbststudium OOP6 & ALG1 Auftrag

Selbststudium OOP6 & ALG Programmieren 1 - H1103 Felix Rohrer

Grundlagen: Algorithmen und Datenstrukturen

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Programmieren in Java

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Technische Universität München SS 2006 Fakultät für Informatik 12. Oktober 2006 Prof. Dr. A. Knoll. Aufgabe 1 Transferfragen (Lösungsvorschlag)

Anweisungen zur Ablaufsteuerung

Übungen zum Bioinformatik-Tutorium. Blatt 6

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Objektorientierte Programmierung

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Übung Informatik I - Programmierung - Blatt 2

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Allgemeine Hinweise:

Übungsblatt 6. Thema: BubbleSort, MergeSort, Divide&Conquer, Master-Theorem

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

21. Greedy Algorithmen. Aktivitätenauswahl, Fractional Knapsack Problem, Huffman Coding Cormen et al, Kap. 16.1, 16.3

Programmiertechnik Übungen zu Klassen & -methoden

Prüfung Softwareentwicklung II (IB)

a) Für das vorgegebene Programmstück ergibt sich folgendes Referenzgeflecht:

Einführung in die Programmierung für NF. Arrays

Prüfung Softwareentwicklung I (IB)

Informatik 1 - Translation Studies in Information Technology. Musterlösung zum Aufgabenblatt der ersten Pflichtübung im Wintersemester 16/17

Selbststudium OOP7 & ALG2 Auftrag

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 14/15

Grundlagen der Informatik / Algorithmen und Datenstrukturen. Aufgabe 139

public class SternchenRechteckGefuellt {

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Informatik Praktikum 5

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Informatik II, SS 2018

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben. Aufgabe 1.1. Alle Aufgaben beziehen sich auf Java.

21. Dynamic Programming III

8. Ausdrücke, Operatoren (einfache Typen)

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Informatik II, SS 2016

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Übung 4: Die generische Klasse AvlBaum in Java 1

Arrays. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Prüfung Softwareentwicklung II (IB)

EINI LogWing/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 17/18

Programmierung für Mathematik HS11

Informatik II, SS 2014

Lösung der Übungsaufgabenserie 12 Grundlagen der Informatik und Numerik

Beispielprüfung CuP WS 2015/2016

Objektorientierte Programmierung OOP Programmieren mit Java

JAVA - Methoden

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Abgabe: keine Pflichtabgabe (vor 12 Uhr) Aufgabe 10.1 (P) Vererbung Gegeben seien folgende Java-Klassen:

Übungslösungen. 1. Übung

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Informatik II. Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rosmannek, David Sidler, Thilo Weghorn FS 2017

1 Klassen anlegen und Objekte erzeugen

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

1 Klassen anlegen und Objekte erzeugen

Objektorientierte Programmierung

EINI WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

ALP II Dynamische Datenmengen

Informatik II Vorlesung am D-BAUG der ETH Zürich. Vorlesung 7, Fallstudie Point-In-Polygon Algorithmus Diskretisierung: Linien zeichnen

Tagesprogramm. Werte und Typen Methoden und Parameter Ergebnisse und Seiteneffekte.

Allgemeine Hinweise:

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Algorithmen und Datenstrukturen

16 - Kompressionsverfahren für Texte

2. Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung

II.3.1 Rekursive Algorithmen - 1 -

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

Übungsstunde 4. Einführung in die Programmierung

Einstieg in die Informatik mit Java

Informatik 1 - Translation Studies in Information Technology. Musterlösung zum Aufgabenblatt der ersten Pflichtübung im Wintersemester 18/19

Übung Sensornetze (für 25. November 2004)

Technische Universität München WS 2005/2006 Fakultät für Informatik 11. Februar 2006 Prof. Dr. A. Knoll

1. Teilklausur Gruppe A. Bitte in Druckschrift leserlich ausfüllen!

Algorithmen und Datenstrukturen SS Übungsblatt 1: Grundlagen

Prüfung Softwareentwicklung I (IB)

Pascal Schärli

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Objektorientierte Programmierung

Vorkurs Informatik WiSe 16/17

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Transkript:

Technische Universität München SS 2006 Fakultät für Informatik Übungsblatt 3 Prof. Dr. A. Knoll 2. Juni 2006 Übungen zu Einführung in die Informatik II Aufgabe 8 Eigenschaften der Entropie Beweis der Implikation H(S) ld q p i 1 q i folgt durch Einsetzen (vgl. Musterlsg.). zu zeigen: H(S) ld q p i 1 q i Nach Aufgabe 1c gilt: H(S) ld q, insbesondere H(S) maximal bei ld q daher verbleibt nur zu zeigen, dass falls H(S) maximal, dann p i 1 q. Es gilt: log x < x 1 (vgl. Anmerkung Aufgabe 1c) Damit: log( 1 qp i ) 1 qp i 1 p i (logq + log p i ) 1 q p i mit p i durchmultiplizieren und Logarithmus aufteilen i p i logq i p i log p i i 1 q i p i über i summieren i p i logq + H(S) 0 mit Entropie ersetzen und Wkt.summe ausnutzen H(S) H([p i 1 q i]) Die Entropie ist damit für alle Verteilungen kleiner als für die Gleichverteilung, daher gilt H(S) ld q H(S) maximal p i 1 q i Aufgabe 9 Optimalität der Huffman-Codierung Um zu zeigen, dass die Huffmancodierung c der Quelle S optimal ist, müßen wir zeigen, dass die mittlere Länge der Codierung eines Zeichens L(c) minimal ist. Dies beweisen wir durch Induktion über die Anzahl der Zeichen. Induktionsanfang: Wenn q 1 ist, c {ε mit L(c) 0 und damit die Codierung optimal. Induktionsschluß: Induktionsannahme: q > 1; Huffmancodierung ist optimal für alle Quellen S mit q 1 Zeichen. Bezeichne Z den Zeichensatz, der sich durch Reduktion gemäß dem Huffmanalgorithmus (vgl. Aufgabe 15) ergibt, c die entsprechende Codierungsfunktion, z das Zeichen, das die beiden Zeichen mit minimaler Häufigkeit z q 1 und z q ersetzt und p die Summe der beiden minimalen Häufigkeiten. Dann gilt: Z q 1. Darüber hinaus ergibt sich: L(c) q p i c(z i )

2 q 2 q 2 q 2 q 2 q 1 (p i c(z i ) ) + p q 1 c(z q 1 ) + p q c(z q ) (p i c(z i ) ) + p q 1 c (z ) < O > + p q c (z ) < L > (p i c(z i ) ) + (p q 1 + p q )( c (z ) + 1) (p i c(z i ) ) + p c (z ) + p (p i c (z i ) ) + p L(c ) + p. Gemäß der Induktionsannahme ist L(c ) minimal. Da p ebenfalls minimal ist, ist auch L(c) minimal. Wir haben somit gezeigt, dass der Huffmanalgorithmus einen optimalen Präfixcode erzeugt. Zusätzlich lässt sich beweisen, dass man eine optimale Datenkompression, die auf Zeichencodierung basiert, stets durch die Verwendung eines Präfixcodes erreichen kann. Der oben durchgeführte Beweis gilt daher allgemein. D.h. es kann keine bessere / kürzere Codierung geben, als die vom Huffmanalgorithmus erzeugte. Allerdings gibt es neben dieser Lösung evtl. noch andere genauso gute Lösungen (indem man z.b. gleichlange Codierungen verschiedener Zeichen vertauscht). Aufgabe 10 Prüfpolynome und CRC-Berechnung (Lösungsvorschlag) a) Gegeben sei das Generator Polynom G 1 (x) x 16 + x 12 + x 5 + 1. Bestimmen Sie die Prüfsumme der Nachricht 100010000011111 mittels G 1 (x) nach dem CRC-Verfahren. 1000100000111110000000000000000 10001000000100001-00000000001010000000000 10001000000100001-11001000010000100 10001000000100001-10000000101001010 10001000000100001-100000 b) Ein Empfänger erhält eine mit G 2 (x) x 3 +x+1 gesicherte CRC-Nachricht 11010. Überprüfen Sie, ob ein Übertragungsfehler eingetreten ist. Ist kein Übertragungsfehler aufgetreten, so müsste restfreie Division der gesicherten Nachricht mit dem Generatorpolynom möglich sein. Dies ist hier jedoch nicht der Fall, so dass offensichtlich Fehler aufgetreten sind:

3 11010 1101 1101 1100 1111 1001 1010 110 c) d) e) l e t a p p e n d _ z e r o e s d a t a n l e t rec append_zeroes_emb n match n with 0 > [ ] _ > 0 : : ( append_zeroes_emb ( n 1) ) in d a t a @ ( append_zeroes_emb n ) ; ; l e t rec x o r _ b e g i n l 1 l 2 match ( l1, l 2 ) with ( _, [ ] ) > l 1 ( hd1 : : t l 1, hd2 : : t l 2 ) when ( hd1 hd2 ) > 0 : : ( x o r _ b e g i n t l 1 t l 2 ) ( hd1 : : t l 1, hd2 : : t l 2 ) > 1 : : ( x o r _ b e g i n t l 1 t l 2 ) _ > f a i l w i t h " e r r o r " ; ; l e t c r c d a t a p o l y n o m i a l l e t rec crc_emb word match word with _ when ( ( L i s t. l e n g t h word ) < ( L i s t. l e n g t h p o l y n o m i a l ) ) > word 0 : : t l > crc_emb t l _ > crc_emb ( x o r _ b e g i n word p o l y n o m i a l ) in d a t a @ ( crc_emb ( a p p e n d _ z e r o e s d a t a ( L i s t. l e n g t h p o l y n o m i a l 1) ) ) ; ;

4 l e t frame [ 1 ; 1 ; 0 ; 1 ; 0 ; 1 ; 1 ; 0 ; 1 ; 1 ] ; ; l e t p o l y n o m i a l [ 1 ; 0 ; 0 ; 1 ; 1 ] ; ; c r c frame p o l y n o m i a l ; ; : i n t l i s t [ 1 ; 1 ; 0 ; 1 ; 0 ; 1 ; 1 ; 0 ; 1 ; 1 ; 1 ; 1 ; 1 ; 0] l e t frame2 [ 1 ; 0 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 ; 0 ; 0 ; 1 ; 1 ; 1 ; 1 ; 1 ] ; ; l e t p o l y n o m i a l 2 [ 1 ; 0 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 ; 0 ; 1 ] ; ; c r c frame2 p o l y n o m i a l 2 ; ; : i n t l i s t [ 1 ; 0 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 ; 0 ; 0 ; 1 ; 1 ; 1 ; 1 ; 1 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 ; 1 ; 0 ; 1 ; 1 ; 0 ; 1 ; 0 ; 1 ; 1 ; 0] Aufgabe 11 LZW-Kompressionsalgorithmus In dieser Aufgabe soll die Funktionsweise des LZW-Algorithmus aus der Vorlesung anhand eines Beispiels von Hand nachvollzogen werden. a) Gehen Sie die Schritte durch, die bei der Komprimierung der Zeichenkette ABRAKADABRA- KADABRAKADABRA... ablaufen. Wie groß ist die Einsparung durch die Codierung in diesem Fall? In Pseudo-Code sieht der Algorithmus wie folgt aus: Initialize string table; prefix <- empty; while (K <- next character in charstream) do Is prefix^k in string table? yes: prefix <- prefix^k; no: add prefix^k to the string table; output the code for prefix to the codestream; prefix <- K; end output the code for prefix to the codestream Die Auswertung für den String ABRAKADABRAKADABRA... läuft dann wie folgt ab: Initialisierung des string-table mit {1 A,2 B,...,26 Z.

5 prefix next-char string-table code-output A A B 27 AB 1 B R 28 BR 2 R A 29 RA 18 A K 30 AK 1 K A 31 KA 11 A D 32 AD 1 D A 33 DA 4 A B AB R 34 ABR 27 R A RA K 35 RAK 29 K A KA D 36 KAD 31 D A DA B 37 DAB 33 B R BR A 38 BRA 28 A K... b) Gehen Sie die Schritte durch, die bei der Dekomprimierung von [8.15.11.21.19.16.28.30.27.29.31.33.19.35.30.32.36.] ablaufen. Die Dekompression sieht in Pseudo-Code so aus: Initialize string table; get first code: <code> output the string for <code> to the charstream; <old> <code> while ( <code> <- next code in codestream) do does <code> exist in the string table? (yes: output the string for <code> to the charstream; [...] <- translation for <old> K <- first character of translation for <code>; add [...]^K to the string table; <old> <code>; ) (no: [...] <- translation for <old>; K <- first character of [...]; output [...]^K to charstream and add it to string table; <old> <code> ) end Die Auswertung für [8.15.11.21.19.16.28.30.27.29.31.33.19.35.30.32.36.] läuft dann wie folgt ab: Initialisierung des string-table mit {1 A,2 B,...,26 Z..

6 next-code output string-table 8 H 15 O 27 HO 11 K 28 OK 21 U 29 KU 19 S 30 US 16 P 31 SP 28 OK 32 PO 30 US 33 OKU 27 HO 34 USH 29 KU 35 HOK 31 SP 36 KUS 33 OKU 37 SPO 19 S 38 OKUS 35 HOK 39 SH 30 US 40 HOKU 32 PO 41 USP 36 KUS 42 POK c) Implementierung des LZW Algorithmus in Java import java.lang.string; import java.util.hashtable; class Lzw { public static void main(string args[]) { if (args.length < 1) { System.out.println("Aufruf: Lzw -c -u Zeichenkette "); return; if (args[0].compareto("-c") 0) { compress(args[1]); if (args[0].compareto("-u") 0) { uncompress(args[1]); private static void compress(string comp) { Hashtable patternlist new Hashtable(); initcodehash(patternlist); int hashcount 27; String checkstring new String(); String prefix new String(); String outstring new String(); for (int i 0; i < comp.length(); i++) { checkstring prefix.concat(comp.substring(i, i+1)); System.out.print("\"" + prefix + "\" " + comp.substring(i, i+1) + " ");

7 if (patternlist.get(checkstring)! null) { System.out.println(); prefix checkstring; else { System.out.println(" " + hashcount + "\"" + checkstring + "\" " + patternlist.get(prefix)); patternlist.put(checkstring, new Integer(hashCount)); hashcount++; outstring outstring.concat(patternlist.get(prefix) + "."); prefix comp.substring(i, i+1); if (prefix.length()! 0) outstring outstring.concat(patternlist.get(prefix) + "."); System.out.println(); System.out.println("Komprimierte Sequenz:"); System.out.println(outString); private static void uncompress(string comp) { Hashtable patternlist new Hashtable(); initstringhash(patternlist); int hashcount 27; int loopcount 0; int old -1; String outstring new String(); while(comp.length() > 0) { int index 0; int code -1; boolean found false; while (!found) { if (comp.charat(index). ) { code Integer.parseInt(comp.substring(0, index)); comp comp.substring(index+1, comp.length()); found true; index++; if (loopcount 0) { outstring outstring.concat((string)(patternlist.get(new Integer(code)))); old code; System.out.println(code + " \"" + (String)(patternList.get(new Integer(code))) + "\""); loopcount++; else { if (patternlist.get(new Integer(code))! null) { String translation (String)(patternList.get(new Integer(code))); outstring outstring.concat(translation); patternlist.put(new Integer(hashCount), ((String)(patternList.get(new Integer(old)))).concat(translation.substring(0, 1))); System.out.println(code + " \"" + translation + "\" "

8 + hashcount + "\"" + ((String)(patternList.get(new Integer(old)))).concat(translation.substring(0, 1)) + "\""); else { String translation (String)(patternList.get(new Integer(old))); translation translation.concat(translation.substring(0, 1)); outstring outstring.concat(translation); patternlist.put(new Integer(hashCount), translation); System.out.println(code + " \"" + translation + "\" " + hashcount + "\"" + translation + "\""); hashcount++; old code; System.out.println(outString); private static void initcodehash(hashtable pl) { pl.put("a", new Integer(1)); pl.put("b", new Integer(2)); pl.put("c", new Integer(3)); pl.put("d", new Integer(4)); pl.put("e", new Integer(5)); pl.put("f", new Integer(6)); pl.put("g", new Integer(7)); pl.put("h", new Integer(8)); pl.put("i", new Integer(9)); pl.put("j", new Integer(10)); pl.put("k", new Integer(11)); pl.put("l", new Integer(12)); pl.put("m", new Integer(13)); pl.put("n", new Integer(14)); pl.put("o", new Integer(15)); pl.put("p", new Integer(16)); pl.put("q", new Integer(17)); pl.put("r", new Integer(18)); pl.put("s", new Integer(19)); pl.put("t", new Integer(20)); pl.put("u", new Integer(21)); pl.put("v", new Integer(22)); pl.put("w", new Integer(23)); pl.put("x", new Integer(24)); pl.put("y", new Integer(25)); pl.put("z", new Integer(26)); private static void initstringhash(hashtable pl) { pl.put(new Integer(1), "A"); pl.put(new Integer(2), "B"); pl.put(new Integer(3), "C"); pl.put(new Integer(4), "D"); pl.put(new Integer(5), "E"); pl.put(new Integer(6), "F");

9 pl.put(new Integer(7), "G"); pl.put(new Integer(8), "H"); pl.put(new Integer(9), "I"); pl.put(new Integer(10), "J"); pl.put(new Integer(11), "K"); pl.put(new Integer(12), "L"); pl.put(new Integer(13), "M"); pl.put(new Integer(14), "N"); pl.put(new Integer(15), "O"); pl.put(new Integer(16), "P"); pl.put(new Integer(17), "Q"); pl.put(new Integer(18), "R"); pl.put(new Integer(19), "S"); pl.put(new Integer(20), "T"); pl.put(new Integer(21), "U"); pl.put(new Integer(22), "V"); pl.put(new Integer(23), "W"); pl.put(new Integer(24), "X"); pl.put(new Integer(25), "Y"); pl.put(new Integer(26), "Z");