Computer Science Unplugged Algorithmen zur Textkompression
|
|
|
- Mina Schräder
- vor 8 Jahren
- Abrufe
Transkript
1 Proseminar Computer Science Unplugged Algorithmen zur Textkompression Harald Zauner 12. November 2004 Zusammenfassung Trotz der rasch zunehmenden Speicherkapazität heutiger Speichermedien besteht nach wie vor das Bedürfnis, Daten so effizient wie möglich zu speichern. Durch Kodierung kann der Speicherplatzbedarf von Daten auf Kosten einer leicht erhöhten Zugriffszeit deutlich reduziert werden. Im Folgenden wird nach einem spielerischen Einstieg der Huffman- und LZW-Algorithmus vorgestellt werden. 1 Einführung Die Speicherkapazität von Computern wächst mit erstaunlicher Geschwindigkeit, innerhalb der letzten 25 Jahre etwa um den Faktor eine Million. Doch mit wachsender Kapazität ergeben sich immer wieder neue Möglichkeiten. So möchte man z.b. auf einem Computer, der ein Buch abspeichern kann, lieber eine ganze Bibliothek unterbringen. Oder anstatt eines Bildes lieber ein ganzes Fotoalbum oder einen Film. Jeder, der einen Computer besitzt, wird bereits festgestellt haben, dass nach einer Variation von Parkinson s Gesetz ( Work expands to fill the time available for its completion ) sich die Daten soweit ausbreiten bis der verfügbare Speicherplatz aufgebraucht ist. Um dieser Entwicklung entgegenzuwirken, bedient man sich der Kompression. Dabei wird die Repräsentation der Daten derart geändert, dass weniger Speicherplatz verbraucht wird. Der Prozeß des Komprimierens und Dekomprimierens wird dabei im Hintergrund ausgeführt, ohne dass der Benutzer davon Kenntnis haben muss. Einerseits braucht der Vorgang des Komprimierens bzw. Dekomprimierens selbst natürlich eine gewisse Zeit, was sich in der leichten Verlangsamung der Schreib- bzw. Lesevorgänge bemerkbar machen könnte. Andererseits kann es aber auch zu einer Beschleunigung kommen, da weniger Daten von der Festplatte gelesen werden müssen und dieser Effekt die nötige Zeit für das Komprimieren kompensiert. Im Laufe der Zeit wurden viele Kompressionsverfahren entwickelt. Dabei zeigt sich aber, dass das Verweisen auf bereits früher aufgetretene Textfragmente eine relativ gebräuchliche Methode ist, welche z.b. beim LZW-Algorithmus angewandt wird. Ein alternativer Ansatz besteht darin, dass man öfter auftretende Zeichen mit einer kürzeren Codierung versieht als weniger oft auftretende Zeichen. Auf dieser Grundidee basieren beispielsweise der Morse-Code und auch der Huffman-Algorithmus. Um eine anschauliche Vorstellung des LZW-Algorithmus zu bekommen, soll nun das Arbeitsblatt aus [1] bearbeitet werden.
2 Abbildung 1: Spielerischer Einstieg aus [1]
3 2 Der LZW-Algorithmus Der LZW-Algorithmus ist eine Weiterentwicklung des LZ78-Algorithmus, welcher 1984 von Terry Welch veröffentlicht wurde. Der LZ77- bzw. LZ78-Algorithmus geht auf Abraham Lempel und Jacob Ziv zurück. LZW findet beispielsweise Verwendung im Grafikformat GIF, in diversen UNIX-Tools (compress, gzip), im Postscript Level 2 Standard (optional), usw. 2.1 Arbeitsweise Der LZW-Algorithmus unterscheidet sich von seinen Vorgängern dadurch, dass das initiale Codebuch alle Zeichen des zu codierenden Alphabets enthält. Auf diese Weise entfällt das explizite Abspeichern von Zeigern auf den Codebucheintrag und auf das nachfolgende Zeichen. Die Komprimierung geschieht dabei wie folgt: Zu Beginn der Kompression sei w der leere String. Schritt 1: Lese das nächste Symbol x aus dem Eingabestring ein und gehe zu Schritt 2. Falls der Eingabestring bereits komplett eingelesen ist, gib w aus. Schritt 2: Fall 1: wx befindet sich noch nicht im Codebuch Ausgabe der Codierung von w Füge dem Codebuch einen neuen Eintrag für wx hinzu Ersetze w durch x und gehe zu Schritt 1 Fall 2: wx ist bereits im Codebuch enthalten Ersetze w durch wx und gehe zu Schritt 1 Die Dekomprimierung funktioniert wie folgt: Zu Beginn der Ausführung sei w das erste aus dem Eingabestring eingelesene Symbol x, dessen Decodierung mit Hilfe des initialen Codebuchs erfolgt und anschließend ausgegeben wird. Schritt 1: Lese das nächste Symbol x aus dem Eingabestring ein und gehe zu Schritt 2. Falls der Eingabestring bereits vollständig eingelesen ist, ist man fertig. Schritt 2: Schritt 3: Decodiere x mit Hilfe des Codebuchs, und gib die Dekodierung C(x) aus. Weiter mit Schritt 3. Füge dem Codebuch einen neuen Eintrag hinzu, welcher aus der Konkatenation von w und dem ersten Zeichen von C(x) besteht. Gehe zu Schritt 4. Schritt 4: Setze w = C(x) und springe zu Schritt 1. Anmerkung: Bei dieser Version des Dekodierungsalgorithmus wird davon ausgegangen, dass das eingelese Symbol x bei Schritt 2 immer in der Codetabelle gefunden wird. Jedoch kommt es bei manchen Wörtern auch vor, dass der Eintrag dafür noch nicht vorhanden ist. In diesem Fall wird bei Schritt 2 C(x) auf w gesetzt, die Konkatenation von C(x) und dem ersten Zeichen von C(x) ausgegeben und die Ausführung wie gehabt fortgesetzt.
4 2.2 Beispiel Wir komprimieren das Wort abrakadabra, das initiale Codebuch C enthalte alle ASCII-Zeichen, also insbesondere C(a) = 97, C(b) = 98, C(d) = 100, C(k) = 107 und C(r) = 114. Schritt w alt x wx C w neu Ausgabe 1 a ja a 2 a b nein C(ab) = 256 b 97 3 b r nein C(br) = 257 r 98 4 r a nein C(ra) = 258 a a k nein C(ak) = 259 k 97 6 k a nein C(ka) = 260 a a d nein C(ad) = 261 d 97 8 d a nein C(da) = 262 a a b ja ab 10 ab r nein C(abr) = 263 r r a ja ra 258 Nun führen wird die Dekomprimierung von durch: Wir verwenden dabei wieder das initiale Codebuch mit allen ASCII-Zeichen, also insbesondere C(97) = a, C(98) = b, C(100) = d, C(107) = k und C(114) = r. Schritt w alt x Codebuch w neu = C(x) = Ausgabe 1 undef 97 kein neuer Eintrag a 2 a 98 C(256) = ab b 3 b 114 C(257) = br r 4 r 97 C(258) = ra a 5 a 107 C(259) = ak k 6 k 97 C(260) = ka a 7 a 100 C(261) = ad d 8 d 256 C(262) = da ab 9 ab 258 C(263) = abr ra abrakadabra ab br ra ad ka ak da abr Abbildung 2: Veranschaulichung der LZW-Komprimierung
5 2.3 Java-Implementierung LZWEncode.java import java. u t i l.map; import java. u t i l. TreeMap ; public class LZWEncode { private S t r i n g input ; private Map c o d e t a b l e ; private S t r i n g B u f f e r r e s u l t ; public LZWEncode( S t r i n g input ) { r e s u l t = new S t r i n g B u f f e r ( ) ; c o d e t a b l e = new TreeMap ( ) ; this. input = input ; i n i t C o d e t a b l e ( ) ; encode ( ) ; System. out. p r i n t l n ( r e s u l t. t o S t r i n g ( ) ) ; private void i n i t C o d e t a b l e ( ) { for ( int i = 0 ; i < 256; i++) { c o d e t a b l e. put ( Character. t o S t r i n g ( ( char ) i ), new I n t e g e r ( c o d e t a b l e. s i z e ( ) ) ) ; private void encode ( ) { S t r i n g w = ; for ( int i = 0 ; i < input. l e n g t h ( ) ; i ++) { char x = input. charat ( i ) ; S t r i n g wx = w + x ; i f ( c o d e t a b l e. containskey (wx) ) { w = wx ; else { c o d e t a b l e. put (wx, new I n t e g e r ( c o d e t a b l e. s i z e ( ) ) ) ; r e s u l t. append ( c o d e t a b l e. get (w ) ) ; w = Character. t o S t r i n g ( x ) ; r e s u l t. append ( c o d e t a b l e. get (w ) ) ; public static void main ( S t r i n g [ ] args ) { new LZWEncode( abrakadabra ) ;
6 LZWDecode.java import java. u t i l.map; import java. u t i l. TreeMap ; public class LZWDecode { private Map c o d e t a b l e ; private int [ ] input ; private S t r i n g B u f f e r r e s u l t ; public LZWDecode( int [ ] input ) { this. input = input ; c o d e t a b l e = new TreeMap ( ) ; r e s u l t = new S t r i n g B u f f e r ( ) ; i n i t C o d e t a b l e ( ) ; decode ( ) ; System. out. p r i n t l n ( r e s u l t ) ; private void i n i t C o d e t a b l e ( ) { for ( int i = 0 ; i < 256; i++) { c o d e t a b l e. put (new I n t e g e r ( c o d e t a b l e. s i z e ( ) ), Character. t o S t r i n g ( ( char ) i ) ) ; private void decode ( ) { S t r i n g w = ( S t r i n g ) c o d e t a b l e. get (new I n t e g e r ( input [ 0 ] ) ) ; r e s u l t. append (w) ; for ( int i = 1 ; i < input. l e n g t h ; i ++) { S t r i n g Cx = ( S t r i n g ) c o d e t a b l e. get (new I n t e g e r ( input [ i ] ) ) ; i f (Cx!= null ) { r e s u l t. append (Cx ) ; else { Cx = w; r e s u l t. append (Cx + Cx. charat ( 0 ) ) ; c o d e t a b l e. put (new I n t e g e r ( c o d e t a b l e. s i z e ( ) ), w + Character. t o S t r i n g (Cx. charat ( 0 ) ) ) ; w = Cx ; public static void main ( S t r i n g [ ] args ) { new LZWDecode(new int [ ] { 97, 98, 114, 97, 107, 97, 100, 256, 258 ) ;
7 3 Der Huffman-Algorithmus David Huffman entwickelte im Jahre 1952 ein heute noch sehr beliebtes Verfahren zur verlustfreien Kompression von Daten, welches z.b. im UNIX-Tool compact und in Faxgeräten als Teil des CCITT-Standards Anwendung findet. Weiterhin wird es oft in Kombination mit LZW und anderen Kompressionsverfahren z.b. beim Grafikformat JPEG eingesetzt. Ähnlich wie beim Morse-Code codiert man Zeichen, welche häufiger im Text auftreten mit einem kürzerzen Code als weniger oft auftretende Zeichen, vgl. untenstehende Tabelle. Symbol A B C D E F G H I J K L M Code Symbol N O P Q R S T U V W X Y Z Code An den Buchstaben A und E sieht man diesen Effekt sehr deutlich. 3.1 Arbeitsweise Mit Hilfe des Huffman-Algorithmus ist es möglich, einen bezüglich der Codewortlänge optimalen Code zu erzeugen. Sei s 1, s 2,..., s n das Alphabet, welches von dem zu kodierenden Textstück benutzt wird. p i bezeichne die Wahrscheinlichkeit, dass s i an einer zufälligen Position auftaucht. Jedes Symbol s i wird durch einen binären Code l i ersetzt, so dass sich die durchschnittliche Länge eines codierten Symbols ergibt zu n L = p i l i Um ein Minimum von L zu erreichen, darf man annehmen, dass die s i schon nach ihrer Wahrscheinlichkeit sortiert sind, und dann gilt: p 1 p 2... p n. L wird genau dann minimal, wenn man nun l 1 l 2... l n wählt, was durch den Huffman-Algorithmus gewährleistet ist. Beschreibung des Algorithmus: Gegeben sei eine initiale Liste bzw. ein Array von Huffman-Blättern mit mindestens 2 Elementen (sonst fertig). Ein Huffman-Blatt ist ein Paar, welches aus einem Symbol s i und der dazugehörigen Häufigkeit p i oder der absoluten Symbolanzahl (schneller!) besteht. Schritt 1: Schritt 2: Schritt 3: Sortiere die Liste von Huffman-Bäumen bzgl. der Häufigkeiten bzw. der absoluten Symbolanzahl. Für die Implementierung geschieht dies mit aufsteigender, für den nachfolgenden Beweis mit absteigender Häufigkeit bzw. Symbolanzahl. Ersetze die beiden Huffman-Bäume mit dem niedrigsten Wert durch einen neuen Knoten, welcher jene als linken und rechten Teilbaum erhält. Die Wertigkeit des neuen Knotens ergibt sich aus der Summe der Häufigkeiten der Teilbäume. Wiederhole Schritt 1 und 2 solange bis die Liste nur noch aus einem einzigen Baum besteht. Aus dem fertigen Huffman-Baum erhält man nun die Codierung jedes einzelnen Symbols, indem man den Pfad von der Wurzel bis zu dem entsprechenden Blatt betrachtet. Für jede Verzweigung nach links verlängert sich die Codierung um eine 0, für jede Verzweigung nach rechts um eine 1.
8 3.2 Beweis der Optimalität der Huffman-Codierung Zu zeigen: L ist minimal Beweis: Beweis durch vollständige Induktion über die Anzahl n der Symbole. Im Folgenden werde mit c(s i ) die Huffmancodierung des Symbols s i bezeichnet, und es gilt l i = c(s i ). Induktionsanfang Sei n = 2. Für die Codierung c(s 1 ) erhält man entweder 0 oder 1 und somit c(s 2 ) = 1 c(s 1 ). L = 2 p il i = p 1 l 1 + p 2 l 2 = p 1 c(s 1 ) + p 2 c(s 2 ) = p 1 + p 2 = 1. Dieser Wert ist optimal, denn 2 Symbole können nicht besser als durch Codelänge 1 codiert werden. Induktionsschritt Induktionsannahme: Die Huffmancodierung sei bereits optimal für alle Textstücke mit n 1 Symbolen (n > 2). Bezeichne S das Alphabet welches sich durch Reduktion gemäß dem Huffmanalgorithmus ergibt, c die entsprechende Codierungsfunktion und s das Symbol, welches die beiden Symbole mit der kleinsten rel. Häufigkeit s n 1 und s n ersetzt. Weiterhin bezeichne p die rel. Häufigkeit von s, also p = p n 1 +p n. Für das reduzierte Alphabet S gilt S = n 1, wodurch die Induktionsannahme erfüllt wird. Die durchschnittliche Codelänge von S sei L mit L = n 2 p i c(s i ) +p c (s ). Es folgt: L = = = = n p i l i = n n 2 p i c(s i ) = p i c(s i ) + p n 1 c(s n 1 ) + p n c(s n ) n 2 p i c(s i ) + p n 1 c (s ) 0 + p n c (s ) 1 n 2 p i c(s i ) + (p n 1 + p n ) ( c (s ) + 1) n 2 p i c(s i ) + p c (s ) + p = L + p Nach der Induktionsannahme ist L minimal. Da p durch den Huffman-Algorithmus ebenfalls minimal gewählt wird, ist auch L minimal. Dies zeigt, dass die Huffman-Codierung optimal ist. 3.3 Beispiel (d,1) (k,1) (r,2) (b,2) (a,5) Abbildung 3: Ausgangszustand: Fünf Knoten, die bereits nach Anzahl sortiert sind
9 (r,2) (b,2) 2 (a,5) 2 4 (a,5) (d,1) (k,1) (d,1) (k,1) (r,2) (b,2) Abbildung 4: 1. Iteration Abbildung 5: 2. Iteration (a,5) 2 6 (d,1) (k,1) (r,2) (b,2) 4 Abbildung 6: 3. Iteration 11 (a,5) (d,1) (k,1) (r,2) (b,2) Aus dem Huffman-Baum ergibt sich folgende Codetabelle: a b d k r Abbildung 7: Huffman-Baum von abrakadabra (4. Iteration) Bei der Kompression von ASCII-Text wird in realen Anwendungen nicht für jeden Text ein neuer Huffman-Baum erzeugt, sondern mit einer fest vorgegebenen Codierungstabelle gearbeitet, welche sich aus den Häufigkeiten der einzelnen Zeichen ergibt. Für die englische Sprache ergibt sich beispielsweise folgende Verteilung: Symbol A B C D E F G H I J K L M Wahrscheinlichkeit Symbol N O P Q R S T U V W X Y Z Wahrscheinlichkeit Ocaml-Implementierung Huffman.ml (teilweise in Anlehnung an [2]) ( Wandelt e i n e L i s t e von chars in einen S t r i n g um ) l e t s t r i n g o f l i s t l = L i s t. f o l d l e f t ( ˆ ) ( L i s t. map ( fun c > S t r i n g. make 1 c ) l ) ( Wandelt einen S t r i n g in e i n e L i s t e von e i n z e l n e n Symbolen ( chars ) um ) l e t l i s t o f s t r i n g s = Stream. npeek ( S t r i n g. l e n g t h s ) ( Stream. o f s t r i n g s ) ( Rek. D e f i n i t i o n e i n e s Huffman Baums ) type a h u f f t r e e = Atom of char a Node of a a h u f f t r e e a h u f f t r e e
10 ( Funktion, welche d i e Gesamtanzahl von Symbolen in einem Huffman Baum z u r u e c k g i b t ) l e t sum ht = match ht with Atom( a, cnt ) > cnt Node ( cnt, l, r ) > cnt ( Fuegt einen Huffman Baum in e i n e L i s t e von Huffman Baeumen ein ) l e t rec i n s e r t elem l s t = match l s t with [ ] > [ elem ] x : : l > i f (sum elem ) < (sum x ) then elem : : x : : l else x : : i n s e r t elem l ( S o r t i e r t e i n e L i s t e von Huffman Baeumen ) l e t rec s o r t h t l i s t h t l = match h t l with [ ] > [ ] x : : l > i n s e r t x ( s o r t h t l i s t l ) ( Erzeugt aus einem S t r i n g s e i n e L i s t e aus Paaren, d i e das entsprechende Symbol mit der z u g e h o e r i g e n H a e u f i g k e i t e n t h a l t e n ) l e t g e n e r a t e c h a r c n t l i s t s = l e t rec a d d t o c h a r c n t l i s t c c h a r c n t l i s t = match c h a r c n t l i s t with [ ] > [ ( c, 1 ) ] ( x, cnt ) : : t when x = c > ( c, cnt + 1 ) : : t ( x, cnt ) : : t > ( x, cnt ) : : ( a d d t o c h a r c n t l i s t c t ) in l e t rec g e n e r a t e c h a r c n t l i s t a u x c c h a r c n t l i s t = match c with [ ] > c h a r c n t l i s t h : : t > g e n e r a t e c h a r c n t l i s t a u x t ( a d d t o c h a r c n t l i s t h c h a r c n t l i s t ) in g e n e r a t e c h a r c n t l i s t a u x ( l i s t o f s t r i n g s ) [ ] ( Wandelt d i e H a e u f i g k e i t s l i s t e in e i n e L i s t e aus Huffman Baeumen um ) l e t rec h t l i s t o f c h a r c n t l i s t c h a r c n t l i s t = match c h a r c n t l i s t with [ ] > [ ] ( a, cnt ) : : t > Atom( a, cnt ) : : ( h t l i s t o f c h a r c n t l i s t t ) ( Erzeugt einen v o l l s t a e n d i g e n Huffman Baum aus e i n e r L i s t e von Huffman Baeumen ) l e t rec g e n e r a t e h u f f m a n t r e e o f h t l i s t h t l i s t = ( H i l f s f u n k t i o n, welche d i e e r s t e n beiden Elemente der h t l i s t zu einem neuen Huffman Baum v e r e i n i g t ) l e t combine min = match h t l i s t with [ ] > [ ] h : : [ ] > [ h ] h1 : : h2 : : t > i n s e r t ( Node (sum h1 + sum h2, h1, h2 ) ) t in ( F a l l s d i e L i s t e noch mindestens 2 Elemente e n t h a e l t, e r f o l g t ein rek. Aufruf, ansonsten wird der v o l l s t a e n d i g e Huffman Baum zurueckgegeben ) i f ( L i s t. l e n g t h h t l i s t > 1) then l e t h t l i s t = combine min in g e n e r a t e h u f f m a n t r e e o f h t l i s t h t l i s t else L i s t. hd h t l i s t ( Erzeugt e i n e C o d i e r u n g s t a b e l l e a l s A s s o z i a t i o n s l i s t e, indem f u e r j e d e s Symbol der Pfad b e r e c h n e t und a k k u m u l i e r t wird ) l e t g e n e r a t e c o d e t a b l e ht = l e t rec g e n e r a t e c o d e t a b l e a u x ht r e s u l t = match ht with Atom( a, cnt ) > [ ( a, r e s u l t ) ] Node ( cnt, l, r ) > ( g e n e r a t e c o d e t a b l e a u x l ( result@ [ 0 ] ) ( g e n e r a t e c o d e t a b l e a u x r ( result@ [ 1 ] ) ) in g e n e r a t e c o d e t a b l e a u x ht [ ]
11 ( Codiert e i n e L i s t e von Symbolen mit einem z u g e h o e r i g e n Huffman Baum ) l e t h u f f m a n e n c o d e c h a r l i s t c h a r l i s t ht = l e t c o d e t a b l e = g e n e r a t e c o d e t a b l e ht in L i s t. f l a t t e n ( L i s t. map ( fun x > L i s t. a s s o c x c o d e t a b l e ) c h a r l i s t ) ( Codiert einen S t r i n g mit H i l f e e i n e s Huffman Baums ) l e t huffman encode s ht = h u f f m a n e n c o d e c h a r l i s t ( l i s t o f s t r i n g s ) ht ( Erzeugt einen Huffmann Baum aus einem S t r i n g ) l e t g e n e r a t e h u f f m a n t r e e s = g e n e r a t e h u f f m a n t r e e o f h t l i s t ( s o r t h t l i s t ( h t l i s t o f c h a r c n t l i s t ( g e n e r a t e c h a r c n t l i s t s ) ) ) ( Gibt d i e Codierung des Huffman Codierung des S t r i n g s zurueck ) l e t huffman s = s t r i n g o f l i s t ( huffman encode s ( g e n e r a t e h u f f m a n t r e e s ) ) Literatur [1] Tim Bell, Ian H. Witten, and Mike Fellows. Computer Science Unplugged [2] Prof. Dr. Alois Knoll. Einführung in die Informatik I WS 2002/03.
Übrigens: um den Algorithmus im Unterricht einzuführen, sind keine Formeln notwendig! Warum reicht die normale ASCII-Codierung nicht aus?
Huffman-Code Dieser Text ist als Hintergrundinformation ausschliesslich für die Lehrperson gedacht. Der Text ist deshalb eher technisch gehalten. Er lehnt sich an das entsprechende Kapitel in "Turing Omnibus"
16 - Kompressionsverfahren für Texte
16 - Kompressionsverfahren für Texte Prof. Dr. S. Albers Kompressionsverfahren für Texte Verlustfreie Kompression Original kann perfekt rekonstruiert werden Beispiele: Huffman Code, Lauflängencodierung,
Dynamisches Huffman-Verfahren
Dynamisches Huffman-Verfahren - Adaptive Huffman Coding - von Michael Brückner 1. Einleitung 2. Der Huffman-Algorithmus 3. Übergang zu einem dynamischen Verfahren 4. Der FGK-Algorithmus 5. Überblick über
Kompressionsverfahren für Texte
Kompressionsverfahren für Texte Prof. Dr. S. Albers Prof. Dr. Th. Ottmann 1 Zeichenkettenverarbeitung Suche in Texten, Textindizes Mustererkennung (Pattern-Matching) Verschlüsseln Komprimiern Analysieren
Aufgabe: Platz-effiziente Kompression von Textdaten
7.3 Huffman-Bäume Anwendung von Binärbäumen Aufgabe: Platz-effiziente Kompression von Textdaten Standardcodierungen von Textdaten ISO-8859-1: 8 Bit pro Zeichen UTF-16: 16 Bit pro Zeichen Codierungen mit
2. Digitale Codierung und Übertragung
2. Digitale Codierung und Übertragung 2.1 Informationstheoretische Grundlagen 2.2 Verlustfreie universelle Kompression 2.3 Digitalisierung, Digitale Medien Ludwig-Maximilians-Universität München, Medieninformatik,
Ziv-Lempel-Kompression von André Lichei
Ziv-Lempel-Kompression von André Lichei Einführung: Die wichtigsten Ansprüche,die an einen Komprimierungs-Algorithmus gestellt werden, sind: - eine hohe Komprimierungsrate - für alle Typen von Daten (
Eigenschaften von Kompressionsverfahren
6 Textkompression Eigenschaften von Kompressionsverfahren Das Ziel der Datenkompression ist es, eine gegebene Information (Datenquelle) auf eine kompaktere Weise zu repräsentieren. Dies geschieht, indem
Kapitel 7: Optimalcodierung und Huffman Coding
Kapitel 7: codierung und Huffman Coding Ziele des Kapitels Auftreten von Fehlern bei zu starker Kompression Konstruktion optimaler Codes Huffman Coding 2 Bisher Theorem (Shannon I): Die mittlere Codewortlänge
Textkompression. Komprimierung von Daten. Runlength Komprimierung (2) Runlength Komprimierung (1) Herkömmliche Kodierung. Runlength Komprimierung (3)
Komprimierung von Daten Textkompression Effiziente Algorithmen VU 2.0 WS 2008/09 Bin Hu Ziel: Platz und Zeit sparen Kompression durch - Effiziente Kodierung - Verminderung der Redundanzen (verlustfrei)
21. Greedy Algorithmen. Aktivitätenauswahl, Fractional Knapsack Problem, Huffman Coding Cormen et al, Kap. 16.1, 16.3
581 21. Greedy Algorithmen Aktivitätenauswahl, Fractional Knapsack Problem, Huffman Coding Cormen et al, Kap. 16.1, 16.3 Aktivitäten Auswahl 582 Koordination von Aktivitäten, die gemeinsame Resource exklusiv
Farb-Fernsehsignal (Composite FBAS)
Farb-Fernsehsignal (Composite FBAS) Quelle: Ze-Nian Li : Script Multimedia Systems, Simon Fraser University, Canada VIDEO- Digitalisierung Gemeinsame Kodierung FBAS Farbbild- Austast- und Synchronsignal
Wie muss der Eingabetext beschaffen sein, damit er sich gut komprimieren lässt?
Lernaufgabe 1a Beim Kofferpacken können wir durch Druck die Luft herauslassen und bringen somit mehr Kleidungsstücke in den Koffer. Im Unterricht haben wir vom Huffman-Code gehört und wissen, dass er nach
Kodierungsalgorithmen
Kodierungsalgorithmen Komprimierung Verschlüsselung Komprimierung Zielsetzung: Reduktion der Speicherkapazität Schnellere Übertragung Prinzipien: Wiederholungen in den Eingabedaten kompakter speichern
2.7 Der Shannon-Fano-Elias Code
2.7 Der Shannon-Fano-Elias Code Die Huffman-Codierung ist ein asymptotisch optimales Verfahren. Wir haben auch gesehen, dass sich die Huffman-Codierung gut berechnen und dann auch gut decodieren lassen.
Seminar. Codierungstheorie
Seminar Codierungstheorie Lempel-Ziv-Verfahren Informatik Sommersemester 25 Tim Schweisgut, Juni 25 Inhalt INHALT... 2 WÖRTERBUCHMETHODEN... 3 Statische Wörterbuchmethoden... 3 Beispiel:... 3 Bemerkung:...
2. Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung
2 Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung 2 Woche: Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung 24/ 44 Zwei Beispiele a 0
Algorithmen und Datenstrukturen 2
Algorithmen und Datenstrukturen 2 Lerneinheit 3: Greedy Algorithmen Prof. Dr. Christoph Karg Studiengang Informatik Hochschule Aalen Sommersemester 2016 10.5.2016 Einleitung Einleitung Diese Lerneinheit
Beispiel: Zeigen Sie, dass H(x) = H 0 = I gilt, wenn alle Zeichen gleichwahrscheinlich sind.
1 2 Im ersten Schritt werden wir uns mit dem Begriff und der Definition der Information beschäftigen. Ferner werden die notwendigen math. Grundlagen zur Quellencodierung gelegt. Behandelt werden Huffman,
Informatik II Übung 2. Pascal Schärli
Informatik II Übung 2 Pascal Schärli [email protected] 08.03.2018 Code Expert Pascal Schärli 08.03.2018 2 Nachbesprechung Serie 1 Aufgabe 1 a) Induktionsbeweis über a möglich? Nein! Der Induktionsanfang
Einführung in die Informatik II Aus der Informationstheorie: Datenkompression
Einführung in die Informatik II Aus der Informationstheorie: Datenkompression Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität München Sommersemester 2 2. Juli 2 Copyright 2 Bernd
ADS: Algorithmen und Datenstrukturen 2
ADS: Algorithmen und Datenstrukturen 2 5. Vorlesung Uwe Quasthoff Abteilung Automatische Sprachverarbeitung Institut für Informatik Universität Leipzig 9. Mai 2012 1 / 35 Datenkompression Bisheriges Hauptziel
6. Komprimierung. (Text)komprimierung ist ein Wechsel der Repräsentation von Daten, so daß sie weniger
Komprimierung 6. Komprimierung (Text)komprimierung ist ein Wechsel der Repräsentation von Daten, so daß sie weniger Platz brauchen Motivation: beschleunigt Plattenzugriffe oder Datenübertragungen Voraussetzung:
Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:
Musterlösung Übung 7 Aufgabe 1 Sehen wir uns zu allererst das gegebene Forth Programm an: 0 3 new - list constant list1 list1 5 new - list constant list2 list1 6 new - list constant list3 list2 2 new -
Informatik-Seminar Thema 6: Bäume
Informatik-Seminar 2003 - Thema 6: Bäume Robin Brandt 14. November 2003 1 Robin Brandt Informatik-Seminar 2003 - Thema 6: Bäume Übersicht Definition Eigenschaften Operationen Idee Beispiel Datendefinition
Wann sind Codes eindeutig entschlüsselbar?
Wann sind Codes eindeutig entschlüsselbar? Definition Suffix Sei C ein Code. Ein Folge s {0, 1} heißt Suffix in C falls 1 c i, c j C : c i = c j s oder 2 c C und einen Suffix s in C: s = cs oder 3 c C
Gierige Algorithmen Interval Scheduling
Gierige Algorithmen Interval Scheduling IntervalScheduling(s,f). n length[s] 2. A {} 3. j 4. for i 2 to n do 5. if s[i] f[j] then 6. A A {i} 7. j i 8. return A Gierige Algorithmen Interval Scheduling Beweisidee:
Algorithmen und Datenstrukturen (für ET/IT)
Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 206 Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Organisatorisches Weiterer Ablauf: heute und Donnerstag,
Ein Fragment von Pascal
Ein Fragment von Pascal Wir beschreiben einen (allerdings sehr kleinen) Ausschnitt von Pascal durch eine kontextfreie Grammatik. Wir benutzen das Alphabet Σ = {a,..., z, ;, :=, begin, end, while, do} und
Bäume 1. Thomas Röfer
Bäume Thomas Röfer Preisverleihung Begriffsdefinitionen Eigenschaften Implementierung von Bäumen Durchlaufen von Bäumen Breitensuche/Tiefensuche Huffman-Kodierung Rückblick Sortieren Permutieren nach Dijkstra
7. Sortieren Lernziele. 7. Sortieren
7. Sortieren Lernziele 7. Sortieren Lernziele: Die wichtigsten Sortierverfahren kennen und einsetzen können, Aufwand und weitere Eigenschaften der Sortierverfahren kennen, das Problemlösungsparadigma Teile-und-herrsche
Anwendungsbeispiel MinHeap
Anwendungsbeispiel MinHeap Uns seien n ganze Zahlen gegeben und wir möchten darin die k größten Zahlen bestimmen; zudem gelten, dass n deutlich größer als k ist Wir können das Problem mit Laufzeit in O(n
Digitale Medien. Übung zur Vorlesung. Vorlesung: Heinrich Hußmann Übung: Renate Häuslschmid
Übung zur Vorlesung Digitale Medien Vorlesung: Heinrich Hußmann Übung: Renate Häuslschmid Wintersemester 2016/17 Häufige Fehler beim Blatt 2 1 c) -> nicht erfüllte Fano-Bedingung bei dem Code 2 a) -> falscher
Basisinformationstechnologie II
Basisinformationstechnologie II Sommersemester 2015 13. Mai 2015 Algorithmen der Bildverarbeitung I: Kompression Universität zu Köln. Historisch-Kulturwissenschaftliche Informationsverarbeitung Dr. Jan
2. Repräsentation und Codierung von Daten. Klassen von Codierverfahren
2. Repräsentation und Codierung von Daten Klassen von Codierverfahren SS 2009 Multimediale Informationsverarbeitung: Repräsentation und Codierung 1 Klassen von Codierverfahren SS 2009 Multimediale Informationsverarbeitung:
13. Bäume: effektives Suchen und Sortieren
13. Bäume: effektives Suchen und Sortieren Java-Beispiele: Baum.java Traverse.java TraverseTest.java Version: 25. Jan. 2016 Schwerpunkte Aufgabe und Vorteile von Bäumen Sortieren mit Bäumen Ausgabealgorithmen:
13. Bäume: effektives Suchen und Sortieren
Schwerpunkte Aufgabe und Vorteile von Bäumen 13. Bäume: effektives Suchen und Sortieren Java-Beispiele: Baum.java Traverse.java TraverseTest.java Sortieren mit Bäumen Ausgabealgorithmen: - Preorder - Postorder
Seminar Kompressionsalgorithmen Huffman-Codierung, arithmetische Codierung
Huffman-Codierung, arithmetische Codierung Theoretische Informatik RWTH-Aachen 4. April 2012 Übersicht 1 Einführung 2 3 4 5 6 Einführung Datenkompression Disziplin,die Kompressionsalgorithmen entwirft
Isomorphie von Bäumen
Isomorphie von Bäumen Alexandra Weinberger 23. Dezember 2011 Inhaltsverzeichnis 1 Einige Grundlagen und Definitionen 2 1.1 Bäume................................. 3 1.2 Isomorphie..............................
7. Dynamische Datenstrukturen Bäume. Informatik II für Verkehrsingenieure
7. Dynamische Datenstrukturen Bäume Informatik II für Verkehrsingenieure Übersicht dynamische Datenstrukturen Wozu? Oft weiß man nicht von Beginn an, wieviele Elemente in einer Datenstruktur untergebracht
Einfache Sortierverfahren in Java, 2. Version
Einfache Sortierverfahren in Java, 2. Version http://www.r-krell.de Datei IntSortReihe2.java 1 // Verschiedene einfache Sortierverfahren + BucketSort 2 // Der (Zeit-)Aufwand nimmt mit (reihung.length)^2
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1
Kapitel 14 Bäume Bäume 1 Ziele Den Begriff des Baums in der Informatik kennenlernen Bäume als verkettete Datenstruktur repräsentieren können Rekursive Funktionen auf Bäumen verstehen und schreiben können
public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test
Manche Funktionen, deren Ergebnistyp void ist, geben gar keine Werte zurück im Beispiel: write() und main(). Diese Funktionen heißen Prozeduren. Das Hauptprogramm hat immer als Parameter ein Feld args
9. Natürliche Suchbäume
Bäume Bäume sind. Natürliche Suchbäume [Ottman/Widmayer, Kap..1, Cormen et al, Kap. 12.1-12.] Verallgemeinerte Listen: Knoten können mehrere Nachfolger haben Spezielle Graphen: Graphen bestehen aus Knoten
Grundbegriffe der Informatik Aufgabenblatt 6
Grundbegriffe der Informatik Aufgabenblatt 6 Matr.nr.: Nachname: Vorname: Tutorium: Nr. Name des Tutors: Ausgabe: 27. November 23 Abgabe: 6. Dezember 23, 2:3 Uhr im GBI-Briefkasten im Untergeschoss von
Kompressionsverfahren
Kompressionsverfahren Quelle: Steinmetz, Ralf: Multimedia-Technologie: Einführung und Grundlagen, Springer, Verlag Verlustlose Kompressionsalgorithmen RLC Huffman Adaptive Huffman Kodierung Arithmetische
Kompression. Tim Kilian
Kompression Tim Kilian Seminar Effiziente Programmierung Arbeitsbereich Wissenschaftliches Rechnen Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität Hamburg
Übersicht. Aktivitäten-Auswahl-Problem. Greedy Algorithmen. Aktivitäten-Auswahl-Problem. Aktivitäten-Auswahl-Problem. Datenstrukturen & Algorithmen
Datenstrukturen & Algorithmen Übersicht Greedy Algorithmen Einführung Aktivitäten-Auswahl-Problem Huffman Codierung Matthias Zwicker Universität Bern Frühling 2009 2 Greedy Algorithmen Entwurfsstrategie
Programmierpraktikum
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Praktikum: Grundlagen der Programmierung Programmierpraktikum Woche 04 (17.11.2016) Stefan Berktold [email protected] PRÄSENZAUFGABEN Heutige Übersicht
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 17/18. Kapitel 14. Bäume. Bäume 1
Kapitel 14 Bäume Bäume 1 Ziele Den Begriff des Baums in der Informatik kennenlernen Bäume als verkettete Datenstruktur repräsentieren können Rekursive Funktionen auf Bäumen verstehen und schreiben können
1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)
Der folgende Mitschrieb wurde von Prof. Alexa am 16.07.2008 als Probeklausur in der MPGI2 Vorlesung gezeigt und wurde auf http://www.basicinside.de/2008/node/94 veröffentlicht. Die Abschrift ist unter
Kurs 1663 Datenstrukturen" Musterlösungen zur Klausur vom Seite 1. Musterlösungen zur Hauptklausur Kurs 1663 Datenstrukturen 15.
Kurs 1663 Datenstrukturen" Musterlösungen zur Klausur vom 15.08.98 Seite 1 Musterlösungen zur Hauptklausur Kurs 1663 Datenstrukturen 15. August 1998 Kurs 1663 Datenstrukturen" Musterlösungen zur Klausur
Abgabe: (vor der Vorlesung) Aufgabe 7.1 (P) Binomial Heap
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen SS 2009 Grundlagen: Algorithmen und Datenstrukturen Übungsblatt 7 Prof. Dr. Helmut Seidl, S. Pott,
Huffman-Kodierung. Fachbereich Medieninformatik. Hochschule Harz. Huffman-Kodierung. Referat. Henner Wöhler. Abgabe:
Fachbereich Medieninformatik Hochschule Harz Huffman-Kodierung Referat Henner Wöhler 11459 Abgabe: 15.01.2007 Inhaltsverzeichnis Einleitung...I 1. Entropiekodierung...1 1.1 Morse Code...2 1.2 Shannon-Fano-Kodierung...3
Fachhochschule Stuttgart Prof. Uwe Schulz 5. Juli 2006 Hochschule der Medien Klausur Informatik, EDV-Nr (42021) Seite 1 von 4
Hochschule der Medien Klausur Informatik, EDV-Nr. 40301(42021) Seite 1 von 4 Name: Matr. Nr.: Note Teil 1: Keine Hilfsmittel! Bearbeitungszeit: 20 Minuten Frage Stichwort Punkte 1 Schleife 2 2 Code-Fragment
Algorithmus zur komprimierten Übertragung von Textdaten an mobile Endgeräte
Fachhochschule Wedel Seminararbeit Algorithmus zur komprimierten Übertragung von Textdaten an mobile Endgeräte Sven Reinck 7. Januar 2007 Inhaltsverzeichnis Inhaltsverzeichnis Motivation 2 Wörterbuch 2.
6 Ü B E R S E T Z U N G E N U N D C O D I E R U N G E N. 6.1 von wörtern zu zahlen und zurück Dezimaldarstellung von Zahlen Num 10
6 Ü B E R S E T Z U N G E N U N D C O D I E R U N G E N 6.1 von wörtern zu zahlen und zurück 6.1.1 Dezimaldarstellung von Zahlen Num 10 Num10(ε) = 0 (6.1) für jedes w Z 10 für jedes x Z 10 Num 10 (wx)
Einstieg in die Informatik mit Java
1 / 15 Einstieg in die Informatik mit Java Collections Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 15 1 Überblick Collections 2 Hierarchie von Collections 3 Verwendung
Mathematik für Information und Kommunikation
Mathematik für Information und Kommunikation Am Beispiel des Huffman- Algorithmus Thomas Borys und (Christian Urff) Huffman im Alltag MPEG Telefax JPEG MP3 ZIP avid Huffman avid Huffman [95-999] www.soe.ucsc.edu/people/faculty/huffman.html
Punkte. Teil 1. Teil 2. Summe. 1. Zeigen Sie, dass der untenstehende Suchbaum die AVL-Bedingung verletzt und überführen Sie ihn in einen AVL-Baum.
Hochschule der Medien Prof Uwe Schulz 1 Februar 2007 Stuttgart Klausur Informatik 2, EDV-Nr 40303/42022 Seite 1 von 2 Name: Matr Nr: Teil 1: Keine Hilfsmittel Bearbeitungszeit: 20 Minuten Teil 1 Teil 2
{0,1} rekursive Aufteilung des Datenraums in die Quadranten NW, NE, SW und SE feste Auflösung des Datenraums in 2 p 2 p Gitterzellen
4.4 MX-Quadtrees (I) MatriX Quadtree Verwaltung 2-dimensionaler Punkte Punkte als 1-Elemente in einer quadratischen Matrix mit Wertebereich {0,1} rekursive Aufteilung des Datenraums in die Quadranten NW,
Referat zum Thema Huffman-Codes
Referat zum Thema Huffman-Codes Darko Ostricki Yüksel Kahraman 05.02.2004 1 Huffman-Codes Huffman-Codes ( David A. Huffman, 1951) sind Präfix-Codes und das beste - optimale - Verfahren für die Codierung
Kapitel 12: Induktive
Kapitel 12: Induktive Datenstrukturen Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2009 Folien nach einer Vorlage von H.-Peter
Digitale Medien. Vorlesung: Heinrich Hußmann Übung: Renate Häuslschmid. Übung zur Vorlesung
Übung zur Vorlesung Digitale Medien Vorlesung: Heinrich Hußmann Übung: Renate Häuslschmid Wintersemester 2016/17 LZW-Komprimierung Idee: Nicht einzelne Zeichen werden günstig kodiert, sondern ganze Zeichenketten
Abgabe: (vor 12 Uhr)
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen SS 2011 Einführung in die Informatik I Übungsblatt 7 Prof. Dr. Helmut Seidl, A. Lehmann, A. Herz,
Property Based Testing
Property Based Testing Nicolai Mainiero sidion Testen ist schwer Testen ist schwer Warum? Alle Pfade durch den Code aufzuzählen ist aufwendig. Selbst vermeintlich einfache Systeme können komplex sein.
Strings. Stringsuche, Boyer-Moore, Textkompression, Huffman Codes.
Strings Stringsuche, Boyer-Moore, Textkompression, Huffman Codes. Suche Substring Häufiges Problem Relevante Beispiele: Suche ein Schlagwort in einem Buch Alphabet: A-Za-z0-9 Suche Virussignatur auf der
Programmiertechnik II Klausur WS 2017/18 Angewandte Informatik Bachelor
Programmiertechnik II Klausur WS 2017/18 Angewandte Informatik Bachelor Name Matrikelnummer Aufgabe Punkte Aufgabe Punkte Zwischensumme 1 10 2 8 3 12 4 20 5 8 58 6 14 7 20 8 12 9 16 Summe 120 Note Prof.
Einfache Sortierverfahren in Java, 1. Version
Einfache Sortierverfahren in Java, 1. Version http://www.r-krell.de 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
Algorithmen und Datenstrukturen (für ET/IT)
Algorithmen und Datenstrukturen (für ET/IT) Wintersemester 2012/13 Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Informationen zur Klausur Termin: 21. Februar 2013,
Effiziente Algorithmen und Komplexitätstheorie
1 Effiziente Algorithmen und Komplexitätstheorie Vorlesung Thomas Jansen 22.06.2006 2 Ein anderer Ansatz Beobachtung in Dokumenten eines Typs wiederkehrende Muster Idee Muster in Wörterbuch speichern,
