Sie sind auf Seite 1von 151

Computerorientierte Mathematik II mit Java

Rolf H. Mohring¨

Technische Universitat¨ Berlin

Institut fur¨

Mathematik

Sommersemester 2005

ii

Vorbemerkungen

Diese Vorlesung ist der zweite Teil des Zyklus Computerorientierte Mathematik und schließt sich direkt an die Computerorientierte Mathematik I an. Dieses Skript basiert auf meiner Vorlesung vom Sommersemester 2004. Zwei Studenten der Vorlesung, Elisabeth Gunther¨ und Olaf Maurer, haben im Sommer 2004 eine ausgezeichnete Ausarbeitung der Vorlesung angefertigt, die von mir nur noch leicht uberarbeitet¨ und erganzt¨ wurde. Das Resultat ist dieses Skript, das auch online unter http://www.math.tu-berlin.de/coga/moehring/Coma/Skript-II-Java/

zur Verfugung¨ steht.

Die Vorlesung umfasst folgende Punkte: Wir behandeln zunachst¨ ein Sortierverfahren namens Bucket- sort, das durch besondere Anforderungen an die Schlusselmenge¨ schon in linearer Zeit sortieren kann. Dann werden Baume¨ , insbesondere binare¨ Baume¨ besprochen und wie diese zur Datenkompression mit dem Huffman-Algorithmus genutzt werden konnen.¨ Baume¨ finden als Suchbaume¨ und insbeson- dere als AVL-Baume¨ weitere Verwendung. Wir kommen dann zu optimalen statischen Suchbaumen¨ und besprechen eine Alternative zum Suchen in Baumen,¨ das sogenannte Hashing. Den Abschluss des Semesters bildet ein Kapitel uber¨ Schaltkreistheorie und Programmierbare Logische Arrays.

iii

iv

VORBEMERKUNGEN

Inhaltsverzeichnis

Vorbemerkungen

 

iii

Inhaltsverzeichnis

v

1 Bucketsort

1

1.1 Einfaches Bucketsort

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

1.1.1 Definition .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

1.1.2 Implementation .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.1.3 Aufwandsanalyse .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.2 Sortieren von Strings mit Bucketsort

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

1.2.1 Sortieren von Strings der Lange¨

k

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

6

1.2.2 Sortieren von Binarzahlen¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

8

1.2.3 Sortieren von Strings variabler Lange¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

9

1.3 Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

13

2 Baume¨

und Priority Queues

 

15

2.1 Baume¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

2.1.1 Grundbegriffe .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

2.1.2 Implementation von binaren¨

Baumen¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

17

2.1.3 Traversierung von Baumen¨

.

2.2.1

. . Implementationen einer Priority Queue .

.

.

.

.

.

.

.

.

.

.

.

.

.

2.2 Priority Queues

Mogliche¨

2.3 Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

3 Huffman Codes und Datenkompression

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

25

26

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

27

29

v

vi

INHALTSVERZEICHNIS

3.1

Codierung .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

29

3.1.1

Prafixcode¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

31

3.2 Der Huffman Algorithmus

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

33

3.3 Weitere Datenkompressionsverfahren

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

41

 

3.3.1 Der adaptive Huffmancode .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

41

3.3.2 Der run length code“

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

41

3.3.3 Der Lempel-Ziv Code

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

41

3.4 Abschließende Bemerkungen .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

43

3.5 Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

44

4 Suchbaume¨

 

45

4.1

Basisoperationen in Suchbaumen¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

46

4.1.1 Suchen nach Schlussel¨

k

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

46

4.1.2 Einfugen¨

eines Knoten

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

46

4.1.3 Loschen¨

eines Knoten

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

46

4.2

Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

51

5 AVL-Baume¨

 

53

5.1 Grundsatzliche¨

Eigenschaften

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

53

5.2 Rotationen .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

57

5.3 Die Basisoperationen in AVL-Baumen¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

61

 

5.3.1 Suchen eines Knotens v

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

62

5.3.2 Einfugen¨

eines neuen Knotens v

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

62

5.3.3 Loschen¨

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

65

5.4

eines Knotens v .

.

.

Literaturhinweise

.

.

.

.

.

6 Optimale statische Suchbaume¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

67

69

6.1 Statische Suchbaume¨

allgemein

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

69

6.2 Optimalitat¨ statischer Suchbaume¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

70

6.3 Konstruktion eines optimalen statischen Suchbaumes

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

73

6.4 Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

81

7 B-Baume¨

 

83

7.1

Definition und Eigenschaften .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

83

INHALTSVERZEICHNIS

vii

 

7.2 Basisoperationen in B-Baumen¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

86

7.2.1

Suchen

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

86

7.2.2

Einfugen¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

86

7.2.3

Loschen¨

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

88

7.3 Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

91

8

Hashing

93

8.1 Hash-Funktionen

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

94

8.1.1 Divisionsmethode

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

95

8.1.2 Multiplikationsmethode

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

95

8.2 Kollisionsbehandlung .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

96

8.2.1 Chaining

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

96

8.2.2 Offene Adressierung

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

97

8.3 Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

106

9

Schaltkreistheorie und Rechnerarchitektur

 

107

9.1 Schaltfunktionen und Schaltnetze .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

107

9.2 Vereinfachung von Schaltnetzen

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

115

9.2.1 Das Verfahren von Karnaugh .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

117

9.2.2 Das Verfahren von Quine und McCluskey

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

120

 

¨

 

9.2.3 Das Uberdeckungsproblem .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

125

9.3 Schaltungen mit Delays .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

126

9.3.1 Addierwerke

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

128

9.3.2 Das Fan-In-Problem

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

130

9.4 PLAs und das Prinzip der Mikroprogrammierung

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

131

9.4.1 Aufbau eines PLAs .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

131

9.4.2 Zur Programmierung von PLAs

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

133

9.5 Literaturhinweise

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

135

Literaturverzeichnis

 

141

Index

 

142

viii

INHALTSVERZEICHNIS

Kapitel 1

Bucketsort

Bucketsort ist ein Sortierverfahren, das grundsatzlich¨ anders als alle Sortierverfahren funktioniert, die wir bisher kennen gelernt haben. Es zeichnet sich dadurch aus, dass es nicht wie die Verfahren aus Teil I der Vorlesung auf paarweisen Vergleichen von Schlusseln¨ basiert, sondern voraussetzt, dass die Schlusselmenge¨ klein und bekannt ist, und dass es Objekte direkt dem richtigen Bucket“ (Fach) zuordnet.

Anschaulich lasst¨ sich dieses Verfahren mit der Verteilung der Post im Postamt auf die Hauser¨ einer Straße vergleichen. Der Brieftrager¨ hat eine Reihe von Fachern,¨ die den Hausnummern entsprechen. Er geht die Briefe der Reihe nach durch und legt jeden Brief in O (1 ) (also konstanter) Zeit in das Fach mit der entsprechenden Hausnummer. Dabei konnen¨ in einem Fach naturlich¨ mehrere Briefe sein, die aber aus Sicht der Ordnungsrelation gleich sind (da sie in das gleiche Bucket sortiert werden, haben sie ja die gleiche Nummer) und daher nicht mehr innerhalb des Fachs sortiert werden mussen.¨ Der Brieftrager¨ entnimmt die Briefe den Fachern¨ der Reihe nach und hat sie damit nach Hausnummern sortiert.

Bei m Hausnummern und n Briefen sortiert er also in O (m + n). Da in der Regel m n gilt, wenn Bucketsort angewendet wird, befindet sich der Algorithmus dann in der Komplexitatsordnung¨ (2n ) = (n ) und man erhalt¨ so also einen Sortieralgorithmus, dessen Aufwand linear von der Anzahl der zu sortierenden Schlussel¨ abhangt.¨

Man beachte, dass die in der CoMa I ermittelte untere Komplexitatsschranke¨ von (n log n) nur Sortieralgorithmen betrifft, die auf paarweisen Vergleichen beruhen. Bucketsort beruht jedoch nicht auf paarweisen Vergleichen von Schlusseln¨ und setzt außerdem zusatzliche¨ Informationen uber¨ die Schlusselmenge¨ voraus. Daher liegt Bucketsort nicht in der Klasse der Sortieralgorithmen, die von dieser Schranke betroffen sind.

Umgesetzt auf Datenstrukturen bedeutet dies:

1

Version vom 24. Marz¨

2006

2

KAPITEL 1. BUCKETSORT

Wirklichkeit

Datenstruktur

Facher¨ Hausnummern Stapel im Fach Briefe am Anfang Briefe am Ende

Array Array-Indizes Liste an jedem Array-Index Liste Liste

1.1 Einfaches Bucketsort

1.1.1

Definition

Wir geben jetzt einen Algorithmus fur¨ die oben erklarte¨ Situation an. Gegeben seien also n Ob-

jekte a 1 , a 2 , Schlusselwerte¨

n. Es gibt