Doina Logofa ˘tu Grundlegende Algorithmen mit Java
Aus dem Bereich IT erfolgreich lernen
Algorithmen und Problemlösu...
553 downloads
1648 Views
7MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Doina Logofa ˘tu Grundlegende Algorithmen mit Java
Aus dem Bereich IT erfolgreich lernen
Algorithmen und Problemlösungen mit C++ von Doina Logofa ˘tu Programmieren lernen mit Java von Erwin Merker und Roman Merker Grundkurs Java-Technologien von Erwin Merker und Dietmar Abts Java ist eine Sprache von Ulrich Grude Grundkurs Java von Dietmar Abts Masterkurs Client-/Server-Programmierung mit Java von Dietmar Abts
Grundlegende Algorithmen mit Java von Doina Logofa ˘tu
www.vieweg.de
Doina Logofa ˘tu
Grundlegende Algorithmen mit Java Vom Algorithmus zum fertigen Programm – Lern- und Arbeitsbuch für Informatiker und Mathematiker Mit 115 Abbildungen
Bibliografische Information Der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über abrufbar.
Das in diesem Werk enthaltene Programm-Material ist mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Der Autor übernimmt infolgedessen keine Verantwortung und wird keine daraus folgende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieses Programm-Materials oder Teilen davon entsteht. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne von Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürfen. Höchste inhaltliche und technische Qualität unserer Produkte ist unser Ziel. Bei der Produktion und Auslieferung unserer Bücher wollen wir die Umwelt schonen: Dieses Buch ist auf säurefreiem und chlorfrei gebleichtem Papier gedruckt. Die Einschweißfolie besteht aus Polyäthylen und damit aus organischen Grundstoffen, die weder bei der Herstellung noch bei der Verbrennung Schadstoffe freisetzen.
1. Auflage 2008 Alle Rechte vorbehalten © Friedr. Vieweg & Sohn Verlag | GWV Fachverlage GmbH, Wiesbaden 2008 Lektorat: Günter Schulz / Andrea Broßler Der Vieweg-Verlag ist ein Unternehmen von Springer Science+Business Media. www.vieweg.de Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlags unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Umschlaggestaltung: Ulrike Weigel, www.CorporateDesignGroup.de Druck und buchbinderische Verarbeitung: MercedesDruck, Berlin Gedruckt auf säurefreiem und chlorfrei gebleichtem Papier. Printed in Germany ISBN 978-3-8348-0369-6
ȱ
ȱȱ
ȱ¢ȱȱȱ¢ȱ ȱȱȱ ȱǵȱȱ ȱȱDZȱȱȱȱȱǯȱȱ ȱ ȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
Geleitwort ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱǮ ȱȱ ȱ ȃȱ ȱ ȱ £ȱ ȱ ȱ £ȱ ¡§ȱ ȱ ȱ ȱ ȱ ãȬ £ȱ ǻ£ǯȱ ǯȱ Ǯȱ ȱ Ȉǰȱ Ǯ¢ȱ ȈǼǯȱ ȱ §ȱ ȱ Ȯȱ Ǯȱ Ȉȱ ȱ ûȱ Ȭ ǰȱȱǮȱȱȈȱȱȱûȱȱȬ§ȱȱȱ ȱȱ£ȱȱȱȱȱ ȱȬ ûȱȱȱ ȱǯȱ ȱ ȱ ã£ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ȱ Ȭȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ Ȭ ȱȬȱ§ǰȱȱȱȱtȱȱ ȱãȬ ǯȱȱȱȱ ȱȱȱ ȱȱȱ£ȱȱ¢ȱ ȱ£ǯȱ ȱ ȱȱ§ȱȱȱȱȱ ǰȱȱȱ ȱ £ȱǰȱȱȱ Ȭǯȱȱȱ£ȱȱ Ȭ ȱȱ ȱ ǰȱ ȱȱ £ȱȱ ȱȱ ȱ ȱûȬ ȱȱȱȱȱ ȱ ǯȱȱûȱ£Ȭ ȱȱȱȱȱȱ ȱȱ§Ȭ ȱȱȱ£ȱ£ȱǻȱûȱȱ¢ǼǰȱȬ §ȱ ȱ £ ȱ ȱ ȱ ǯȱ ûȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ śǰȱ ȱ ȱ ȱ Ŝȱ ûȱ ȱ ǰȱȱȱȱȱ ȱȱȱǰȱ£ǯȱǯȱȱȬ ȱ ȱȱȱǯȱȱǯǯ¢ǯȱȱȱȱȱȱȬ ȱȱȱȱǻȱȱȱǼȱȱȱȱȱȱȱȬ ȱDzȱȱ ȱȈȈȱȱȱȱȱȱȬ ȱȱǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ £ȱ ǰȱ ȱ ¡ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ £ǯȱ ȱ ǯȱȱûȱ VII
Vorwort ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱȱ ȱȱ ȱȱ ȱȱ ȱ ȱãȱȱƸƸȱǰȱȱȱ£ȱ ȱȱǯȱȱȱ ȱ ȱ ȱ ȱ ãđȱ ȱ ǰȱ §ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ £ǯȱȱȱȱȱȱȱȱ ȱûȱȱȱȱ Ȭ ¡§ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ Ȭ §ȱ ȱ ¢ȱ ȱ ȱ ȱ §£ȱ ãȱ ǯȱ
£ȱ ȱ ȱ ȱ ȱ ȱ £ǯȱ ǯȱ ȱ Ȭȱ ȱ ¢Ȭ ǰȱȱȱȬ ȱȱȱǻȱȱǼȱȱ
ȱ ûȱ ȱ ¢ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ §ȱȱȱƸƸȬȱûȱȱȱđȱȱȱ£§£ȱ tȱ ǯȱ ȱ ȱ ȱ ȱ ãȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ȱ ȱ§ȱǰȱûȱȱȱȱãȱ£ȱǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ŜŖȱ ȱ £ ǯȱ ǰȱ ȱ §ȱ ¢ȱ ȱ ȱ ȱ ãȱ ǰȱ ȱ ŘŚŖȱ tȬ ȱȱȱŗřŖȱȱȱǯȱȱãȱ ȱ ȱȱ ȱ ȱ ãȱ ȱ ȱ tȱ ûȱ ȱ ǯ ȱ Ȭ ȱ ȱ ȱ ǰȱ ȱ ȱ Ȭȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ûȱ ǯȱ ȱ ãȱ ȱ ȱ Ȭ ȱûûǯȱȱȱȱȱ¢ȱȱ ȱȱãǰȱ ȱȱȱȦȱã£ȱȱȱ Ȭ ȱ §ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ û ãȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ £ȱ §ǯȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱȱȱǰȱȱȱȱȱ §ǯȱ ȱȱȱ ȱȱ ȱŗǯŜǯȱȱ ǰȱȱĸȱȱ£ȱ ûȱ ȱ ǻDZȦȦǯǯȦȦ Ǽǯȱ ȱ ȱ ȱ ãȱ tǰȱȱȱȱǰȱȱ£ȱ§ȱȱȱȱ£ȱ ǰȱȱȱȱȱȱȱ ȱãȱȱȱȬ §ȱǯȱȱ IX
ȱ ȱȱ£ ǯȱȱ ȱȱȱ ȱ ȱȱ ȱ £ȱ £ ǯȱȱȱ ȱȱ ȱǯȱȱ ǰȱȱȱǰȱȱǰȱȱȱȱȱȱǰȱȱȱ ȱȱûǰȱ ȱȱȱȱ¡ǰȱȱȱȱǰȱ£ȱ ǯȱȱ ȱ ȱ ǰȱ ȱ £ǯȱ ǯȱ Ȭǰȱ Ȃȱ ǰȱ ûȱ ȱ ǰȱ Ȭǰȱ ȱ ȱ ǰȱ §ǰȱ ¡ȱ ûǰȱ ȱ ȱ £ȱ ȱ Ȭ£ǯȱ ȱ ȱ ȱ Ȭ ȱȱȱȱ¢ȱǻǼǰȱȱ¢ȱ ȱ ȱ ǻǼȱ ȱ Ȭȱ ¢ȱ ȱ ȱ ǻǼȱ ȱ ȱ£ǰȱ£ȱȱûȱȱȱ£ȱǯȱ ȱ ȱ ȱ £ȱ ȱ ǰȱ ȱ ȱ ȱ ûȱ ȱ đǰȱ £ ȱ £ ȱ ȱ tȱ DZȱȱ ȱ ûǰȱ §ȱ ȱ ȱ ǰȱ ȱ ȱǰȱȱȱǰȱãȱȱ¢ǯȱ ȱ ȱȬȱ£ȱȱȱȱDZȱ ȱ ǯȬȬǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ǰȱ ȱ ȱ ǰȱ ȱ ȱ ȱ £ȱ Ȭ DZȱȱ ȓ¢ǯȱ ȱ ûȱȱȱȱȱǯȱ ȱ ȱ ȱ ȱûȱȱȱȱȱǷȱ ȱ ȱ ȱ ûǰȱȱ ȱ ȱ ȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ©ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱȱŘŖŖŝȱ ǯȬǯȱ
X
Danksagung ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ûǰȱ ȱ ȱ ȱ ȱȱ£ ȱȱ ȱȱ£ȱȱǯȱûȱȱȱȱ ȱãȱǰȱ ȱ§ȱȱ ȱȱȱȱȱ ȱ ûȱ ȱ ȱ ȱ ȱ Ȭ ȱ ǯȱ ǯȱ ȱ ûȱ ȱ £ ȱ ŗşŞŜȱ ȱ ŗşŞŞȱ ȱ ȱ £ ȱ ȱ ǻȬ ǼȱȱȱȱȬ¢ȱǻǼȱȱ ȱȱȱ ȱȱȱȱȱȱȱȱȱû ȱ ǯȱ ȱ ȱȱȱȱ£ȱȱ£ȱȱ ǰȱȱȱȱ ȱȱȱȱ Ȭȱȱȱȱȱȱȱȱǯȱ ȱ ȱ ȱ ȱ ûȱ ȱ ǯȱ ǯȱ ȱ ǰȱ ȱ ȱ ȱ ȱȱȱ§ȱǯȱȱȱȱȱǰȱ ȱȱȱȱȱȱȱ£ȱ £ȱȱȱȱǮȱȱ ȱ Ȅȱ £ȱ ǯȱ đȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱǻȱŗŘǰȱ ȱŝǰȱǼȱȱȱȱȱ ȱ ǻ ȱ ŚǼȱ ǯȱ tȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ã ȱ ¢ǰȱ ȱ đǰȱ ǯȱ ûȱ ǰȱ ȱ ȱ ȱ ȱ ȱ Ȭ ȱ §ȱûǯȱûȱȱȱǯȱȱ ȱ ûȱȱ£ȱȱȱȱȱȱ ȱǯȱǯȱȱȱ ȱǻ§ȱǰȱǼǰȱǯȱǯȱȱ ȱȱǯȱǯȱȱ l©óȱǻȱ§ȱǰȱ§Ǽǯȱ ȱ ûȱ ȱ ǰȱ ȱ ȱ ȱ ȱ £ȱ ûǰȱ ȱ ȱ ȱ ȱ ȱ
ȱǯȱǯȱȱ ȱȱǻȱ Ǽǰȱ ȱ ǯȱȱǻȱȱ ǰȱ ȱ ȱ Ǽǰȱ ȱ ǯȱ ȱ ǻȱ ȱ ȱ Ǽȱ ȱ Ȭ ȱȱǻȱȱȱȬ Ǽǯȱ
XI
ȱȱ ȱȬȱǻ Ǽȱûǰȱȱȱȱȱȱȱ ȱ ȱ ȱ ȱ ȱ ȱ û£ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱǯȱ ȱȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ǻ ¢ȱ Ǯ ǯȱ ȄǼȱȱȱȱǻȱŝǼȱȱȱȱ ȱȱ ȱȱ§ǯȱȱȱȱȱȱȱȱȱ ȱǰȱȱȱ ȱûȱȱȱ£ȱǯȱ ȱȱ ȱđȱȱȱǰȱȱȱȱȱȱãȱǯȱ ȱ ȱ ȱ ȱ ûǰȱȱ ȱ ȱ ȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ©ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱȱŘŖŖŝȱ
XII
Inhaltsverzeichnis ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ GELEITWORT von Dr. Eric Müller
VII
VORWORT
IX
DANKSAGUNG
XI
ȱ ȱ 1 ALGORITHMEN – GRUNDLEGENDE KONZEPTE
1
Abstammung des Wortes Algorithmus Alternative Definitionen Beispiele für Algorithmen Euklidischer Algorithmus Das Sieb des Eratosthenes Binäre Suche Rezept für Tiramisu Vom Problem zur Lösung Eigenschaften eines Algorithmus Algorithmik Das RAM-Rechnermodell Die Komplexität von Algorithmen Optimalität, Reduktion, Beispiele Wachstum von O(g(n)) Die reelle Zeit eines Algorithmus (polynomial vs. exponentiell) Klassifizierung der Probleme (P, NP, NP-vollständig, NP-hart) Probleme NP-vollständig (NP-complete) Das Erfüllbarkeitsproblem (SAT) Die Klasse der NP-hart Probleme Aufgaben
1 1 2 2 3 4 6 7 10 10 11 12 14 17 17 18 19 20 21 22
ȱ
XIII
2 VERSCHACHTELTE SCHACHTELN Problembeschreibung Problemanalyse und Entwurf der Lösung Der Algorithmus Das Programm Die Programmanalyse Aufgaben Anmerkungen
3 GREEDY Grundlagen Problem 1. Rucksackproblem Problem 2. Kartenfärbung Problem 3. Springer auf dem Schachbrett Problem 4. Minimaler Spannbaum (Kruskal-Algorithmus) Problem 5. Huffman-Kodierung
4 DATA ORDERING PROBLEM Problembeschreibung Problemdomäne, Definitionen DOP und DOPI sind NP-vollständig Algorithmen für DOP und DOPI Zufällige-Lösung-Algorithmen (RAN) Exakt-Algorithmen (EX) Greedy_Min-Algorithmen (GM) Greedy_Min Simplified-Algorithmen (GMS) Algorithmen mit unterer Schranke (LB) Implementierungsdetails Programm Auswertung der Ergebnisse Aufgaben
5 REKURSION Vollständige Induktion Rekursion: Grundlagen Problem 1. Quersumme und Spiegelung einer natürlichen Zahl Problem 2. Die Zahl 4 Problem 3. Rest großer Potenzen Problem 4. Die Torte (lineare Rekursion) Problem 5. Die Ackermannfunktion (verschachtelte Rekursion, "compound recursion") Problem 6. Rekursive Zahlenumwandlung (Dezimalsystem in System mit Basis P) XIV
25 25 26 27 29 32 37 38
39 39 40 43 45 48 56
65 65 66 71 72 73 74 74 75 75 77 84 94 96
99 99 105 106 108 111 115 118 120
Problem 7. Summe zweier Wurzeln (verzweigte Rekursion) Problem 8. Collatz-Funktion (nicht-monotone Rekursion) Problem 9. Quadrate und Quadrätchen Problem 10. Quadrate (direkte Rekursion) Problem 11. Quadrate und Kreise (indirekte Rekursion) Problem 12. Die Koch’sche Schneeflockenkurve
6 TEILE UND HERRSCHE Grundlagen Problem 1. Größter gemeinsamer Teiler mehrerer Zahlen Problem 2. Die Türme von Hanoi Problem 3. Integral mit Trapezregel Problem 4. Quicksort Problem 5. Mergesort (Sortieren durch Verschmelzen) Problem 6. Quad-Bäume Problem 7. Diskrete Fourier-Transformation (DFT)
7 BACKTRACKING Problem 1. Das Problem der n Damen Allgemeine Bemerkungen zum Backtracking-Verfahren Problem 2. Das Problem der n Türme Problem 3. Das Problem der Türme auf den ersten m Reihen Problem 4. Das Problem der aufsteigenden Türme auf den ersten m Reihen Problem 5. Die Freundschafts-Jugendherberge Problem 6. Partitionen einer natürlichen Zahl Problem 7. Erdkunde-Referate Problem 8. Alle Wege des Springers Problem 9. Das Fotoproblem Problem 10. Der ausbrechende Ball Problem 11. Orangensport Problem 12. Testmusterkompaktierung Problem 13. Sudoku Problem 14. Das Haus des Nikolaus Noch 10 Probleme 8 DYNAMISCHE PROGRAMMIERUNG Grundlagen, Eigenschaften des Verfahrens 1. Ursprung des Konzeptes 2. Optimalitätsprinzip 3. Überlappung der Probleme, Speicherung der optimalen Teilproblemlösungen (Memoization) 4. Einführendes Beispiel – die Fibonacci-Folge 5. Bottom-up versus top-down
123 125 127 130 133 135
145 145 146 148 150 152 155 157 162
169 169 175 178 179 180 181 182 185 188 191 193 196 205 214 221 224 231 231 231 231 232 232 234 XV
6. Vergleich mit anderen Verfahren Aufgaben Problem 1. Das Zählen der Kaninchen Problem 2. Längste aufsteigende Teilfolge Problem 3. Längste gemeinsame Teilfolge (LCS) Problem 4. Zahlen-Dreieck Problem 5. Domino Problem 6. Verteilung der Geschenke Problem 7. Ähnliche Summe Problem 8. Schotten auf dem Oktoberfest Problem 9. Springer auf dem Schachbrett Problem 10. Summen von Produkten Problem 11. Minimale Triangulierung eines konvexen Vielecks Problem 12. Multiplikation einer Matrizenfolge Problem 13. Edit-Distanz Problem 14. Arbitrage
9 POTENZSUMMEN Problembeschreibung Problemanalyse. Algebraische Modellierung Von der Rekursionsgleichung zum Algorithmus Der Algorithmus Programm Aufgaben
234 235 236 240 245 249 253 258 261 266 275 280 286 291 297 305
311 311 311 313 316 318 321
LITERATURVERZEICHNIS
323
STICHWORTVERZEICHNIS
327
ȱ
ȱ
XVI
Algorithmen – grundlegende Konzepte
1
ȱ ȱ ȱ ȱ ȱȱȱȱȱȱȱȱȱȱ ȱȱ £ȱȱǯȱȱȱȱ £ǰȱȱȱȱȬ ȱǰȱȱ ȱ§ȱǰȱ ȱȱȱ£ȱȱ ȱȱȱ£ûǯȱ ȱ
Abstammung des Wortes Algorithmus ȱ ȇȱȱȱȱȬ £ȱǻǯȱŝŞŖȮŞśŖǼȱ ȱ ȱ ȱ ǰȱ ǰȱ ȱ ȱ ǯȱȱȱȱȱȱȬ £ȱ ǻǼȱ ȱ ȱ ȱ ǮȄǯȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ǰȱ ȱ ȱ Ȭȱ ȂȬǰȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ £ȱ Ȭ £ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ £ȱ ãǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûǰȱ ȱ ȱ ȱ ȱ ȱȱȱȱȬȱȱȱǯȱȱ
Alternative Definitionen ȱ đȱȱ £ȱãȱ ȱȱȱȱDZȱ • ȱȱȱȱȱǰȱȱȱȱãǯȱȱȱãȱȬ ȱȱȱȱȱȱûȱ ǯȱ • ȱȱȱȱȱ ǰȱȱȱȱȱȱ£ȱ ȱȱȱȱãȱûȱȱ£ȱȱȱȱ ǯȱ • ȱȱȱ£ȱ ȱǰȱȱȱȱȱȱȱ ûȱ ȱǯȱ
2
Grundlegende Algorithmen mit Java • •
ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǯȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ¢ȱ ȱ ȱȱȱȱûȱ ǯȱ
Beispiele für Algorithmen Euklidischer Algorithmus.ȱȱȱǰȱ ȱ ȱȬ ȱ ûȱ ȱ ǰȱ ȱ ȱ ȱ Ȭ ǯȱ ȱ ȱ ¡£ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ǯȱ řŖŖȱ ǯȱ ȱ ȱ ȱ ȱ ȱ Ȭ ȱ ǯȱ ãđȱ ȱ ȱ ȱ ȱ Ǯȱ ȃȱ ǰȱ ȱ ȱ ŗřȱ ûȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ȱ ȱ ȱ ȱ ȱ ȱ £Ȭ ȱǯȱȱ ȱ ȱ
ȱȱȱǰȱȱȱȱȱȱDZȱȱǰȱȱ∈ȱWȱȱ ȱ ȱȱȱŗȱƽȱȱȱŗȱƽȱǯȱȱȱȱȱǻǰȱǼǰȱȱȱȱƽȱƸȱȱŖȱri ǀȱ ǯȱ ûȱ ȱ ȱ ¡ȱ ȱ ȱ đȱ Ƹŗƽȱ ȱ Ƹŗƽǯȱ ȱ ȱ ȱ ȱ ¡ȱǰȱȱȱȱƽȱŖȱǯȱûȱȱȱȱǻǰȱǼȱƽȱȬŗȱ ǻãđȱȱȱ ȱȱȱǼǯȱȱȱȱDZȱ ȱ ȱȱ ȏ ȱ ȱ ŗǯ ȱǰȱȱzȱWǰȱȱǃȱȱǁȱŖȱ ȱ Řǯȱȱȱȱŗȱbȱǰȱŗȱbȱǰȱȱbȱŗȱ ȱ řǯ ȱǻȱ≠ȱŖǼȱȱ ȱ řǯŗǯȱȱƸŗȱbȱȱ ȱ řǯŘǯȱȱƸŗȱbȱȱǻƽȱȱǼȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱřǯřǯȱȱȱȱȱȱȱbȱƸŗȱ ȱ ȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱŚǯȱȱȱȱǻǰȱǼȱƽȱȬŗȱ ȱ ȏ ȏ ȱ ȱ ȱ ȱ ȱ ȱ
1 Algorithmen – grundlegende Konzepte DZȱ ȱ a = 294, 294 = 3 x 77 77 = 1 x 63 63 = 4 x 14 14 = 2 x 7
b = 77 + 63 + 14 + 7 + 0
2521 338 155 28 15 13 2
3
= = = = = = =
a 7 2 5 1 1 6 2
= 2521, b = 338 x 338 + 155 x 155 + 28 x 28 + 15 x 15 + 13 x 13 + 2 x 2 + 1 x 1 + 0
ȱ Das Sieb des Eratosthenesǯȱ ȱ ȱ ȱ ǻǯȱ ŘŝŜȮŗşŚȱ ǯȱ ǯǼȱ ȱ ǰȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ¢ǰȱ ȱ ¢ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ¡ǯȱ ȱ ȱ ȱȱȱȱȱ¡ǯȱȱ ȱȱȱ đȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ¢ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱȱ ȱȱȱȱȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱȱȱȱȱȱ§Ȭȱȱȱȱǰȱȱ ȱȱȱ ȱȱȱȱǯȱđȱȱȱȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ £§ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ §đȱ ȱ Ȭ ǰȱȱ£ȱǯȱȱȱȱ¡ǯȱ ȱ ǯȱ ȱ £ȱ ȱ ȱ ûȱ ȱ ãđȱ ȱ ŗǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ŗȱ ȱ ǯȱ ȱ ȱ ȱ ãđȱ ȱ ŗȱ ȱ ȱ £Ȭ £ǯȱ ȱ ȱȱȱȱȱȱǰȱ ȱȱȱûȱȱȬ ȱ ǰȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ ȱ Řǰȱ ȱ ȱ §ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ řǰȱ śǰȱ ŝdzȱ ǯȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ãǰȱ ȱȱȱđȱȱǯȱ ȱȱǰȱȱȱ£ȱǰȱ ȱȱȱȱȱûȱȱȱDZȱ ȱ ȱ ȱ ȱ
4
Grundlegende Algorithmen mit Java
ȏȏ ǻǼȱ ŗǯ ȱȱȱûȱȱȱŘȱȱȱǯȱ Řǯ ȱ←ȱŗȱ řǯ ȱ řǯŗǯ ȱȱ←ȱȱǰȱȱãđȱȱȱȱȱȱȱ ȱ ǻȱȱȱŘǼȱ řǯŘǯ ȱȱȱŘȉǰȱřȉǰȱŚȉǰȱǯǯǯȱȱ££ȱȱ řǯřǯ ȱ←ȱȱ ȱǻȱȱǀȱ√ȱǼȱ Śǯ £ȱ←ȱȱȱȱ śǯ ȱȱȱȱ£ȱ£ ȱŗȱȱǯȱ ȏȱ ȏȏ ǻǼȱ ȱ DZȱ ȱ ȱȱȱȱŘȱ
ȱȱȱȱśȱ
ȱȱȱȱřȱ
ȱ
ȱ£ȱȱŚŞȱ
ȱ
ȱ Binäre Suche. ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ŗǰȱ Řǰȱ ǯǯǯǰȱ ȱ ȱ ȱ ȱ ¡ȱ ǯȱȱȱȱȱȱȱȱȱǰȱȱȱȱȱȱȱȱ ȱ¡ȱûǯȱȱȱȱtȱǰȱȱ ȱŖȱ£ûǯȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ £ȱ ȱ ǯȱ ȱ §ȱ ȱ ȱ ǰȱ ȱ ȱ ȱȱȱ¡ȱ£ȱȱȱ£ȱȱǰȱȱȱȱ ȱ§ǯȱ ȱ
1 Algorithmen – grundlegende Konzepte
5
ȱ ȏ ȏ ȱ ȱ ŗǯ ȱ¡ǰȱŗǰȱŘǰȱǯǯǯǰȱȱ ȱ Řǯ ȱȱ←ȱŗǰȱȱ←ȱȱ ȱ řǯ ȱǻȱȱǀȱȱǼȱȱ ȱ řǯŗȱȱ m ← ª i + j º ȱ ȱ « 2 » ¬ ¼ ȱ ȱǼȱȱȱ←ȱȱƸȱŗȱ řǯŘȱȱȱǻȱ¡ȱǁȱ ȱ ȱȱȱȱȱȱȱȏȱ ȱ řǯřǯȱȱȱ←ȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱȱȱȱȱȱȱŚǯȱȱȱȱǻȱ¡ȱƽȱȱǼȱȱȱ←ȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱȱȱȱȱȱȱśǯȱȱȱȱȱ←ȱŖȱ ȱ ȱȱȱȱȱȱȱȱȱŜǯȱȱȱȱȱ ȱ ȏȱ ȏ ȏ ȱ ȱ ȱȱ ȱȱřǯŘǯȱûȱ ǰȱȱȱȱȱ¡ȱȱȱȱȱǻȱȱȱȱ ȱȱǽǰȱǾǼǯȱȱǰȱȱ ȱȱȱǽƸŗǰȱǾȱ ǰȱȱȱȱ ǽǰȱǾȱǻȱřǯřǼǯȱ ȱ
ȱȱǰȱ ȱȱȱûȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱȱ ȱȱ ȱȱ ¡ȱȱ £ǰȱ ȱ ȱ ŗŝȱ ȱ ǰȱ ȱ ȱ £ȱ ȱ ȱ ȱ DZȱ ŗǰȱǯǯǯǰȱȱƽȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱ£ȱ ¡ȱƽȱȱȱȱȱȱȦȦȱȱȱ ȱ←ȱŗǰȱȱȱȱ←ȱŗŝȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱ£ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱ£ȱ ȱȱȱȱȱȱȱȱȱȱȦȦȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱƽȱŗǰȱȱƽȱşȱȱǻřǯřǼȱǰȱȱ←ȱśȱǻřǯŘǯȱȱřǯřǯǼȱ ȱȱƽȱŗǰȱȱƽȱŗŝǰȱȱ←ȱşȱȱǻřǯŘǯȱȱřǯřǯǼȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱ£ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱ£ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱƽȱśǰȱȱƽȱşȱȱǻřǯŘǼȱǰȱȱ←ȱŝȱǻřǯŘǯȱȱřǯřǯǼȱ ȱƽȱŝǰȱȱƽȱşȱȱǻřǯŘǼȱǰȱȱ←ȱŞȱǻřǯŘǯȱȱřǯřǯǼȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱ£ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱ£ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǻȱƽȱǼȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱƽȱŝǰȱȱƽȱŞȱȱǻřǯřǼȱǰȱȱ←ȱŝȱǻřǯŘǯȱȱřǯřǯǼȱ ȱƽȱŝǰȱȱƽȱŝȱȱȱȱ ȱ ȱ
6
Grundlegende Algorithmen mit Java
Rezept für Tiramisu. ȱ ȱ DZȱ
ŗȱ
đȱ
ȱ
ǻŘŖŖȱ
Ǽȱ
ãǰȱ śŖŖȱ ȱ ǰȱ Śȱ ǰȱ Řȱ ãȱ ǰȱ śȱ ãȱ ǰȱ ȱ
ǰȱŗȱȱ ǯȱ ȱ ȱ ȱ ȏȱ ŗǯ ȱ ȱȱȱȱđǯȱ Řǯ ȱȱ£ȱȱ ȱ§ǯȱ řǯ ȱȱȱȱȱȱȱȱǯȱ Śǯ ȱȱ đȱǯȱ śǯ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱǯȱ Ŝǯ ȱ£ȱȱȱǰȱȱȱȱ ǯȱ ŝǯ ȱ đȱȱȱȱ§ȱȱǯȱ Şǯ ȱȱ đȱ£ȱȱ£ǯȱ şǯ ȱ ȱ ȱ ȱ ȱ §đȱ ȱ ȱ §ȱ ȱ ȱ û£ǯȱ ŗŖǯ ȱȱȱȱ§ȱȱǯȱ ŗŗǯ ȱȱȱȱ§đȱǯȱ ŗŘǯ ȱ ȱ ȱ ȱ ǰȱ ȱ ûȱ ǰȱ ȱ ȱ
ûȱǯȱ ŗřǯ ȱȱȱȱ ȱǯȱ ȏȱ ȏȱ ȱ ǰȱȱȱȱȱȱȱ£ȱȱȱȱǯȱ ȱ ȱ £ȱ ûȱ ǰȱ ȱ ǰȱ ȱ ȱ ȱ £ȱ ȱ ȱ ǯȱ ȱ ȱ £ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ǻǼȱ ûȱ ȱ ȱ ǻǼȱ ȱ ȱ ȱ ȱ ǻǼȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱȱûȱ ȱȱȱŗŘȱȱŗŗȱ ûǰȱ ȱ ȱ ȱȱŗřȱ ǻȱ ȱǼȱȱŗŘȱǰȱȱȱȱȱǯȱ ȱ
1 Algorithmen – grundlegende Konzepte
7
ȱȱȱ ȱǰȱȱȱȱȱȱǰȱȱ£ȱȬ ȱãȱȱûǯȱȱȱ ǰȱȱȱ§ȱȱȱ ǰȱ ȱ ȱ ȱ ããǯȱ ȱ ãȱ ȱ £ ȱ £ȱ ǰȱȱȱȱȱ£ȱȱȱȱȱȱȱȱȱãȬ ȱȱ ȱ§ȱ ǯȱȱȱȱȱ ȱȱȱ ãǯȱȱûȱãȱ ȱȱȱȱȱǰȱȱȬ ȱ£ǯȱ
Vom Problem zur Lösung ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ đȱ ǰȱȱ ȱǯȱȱȱȱȱȱȱȱ ȱ£ ȱDZȱȱȱǯȱȱ • ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻ ȱǰȱǰȱãǼDzȱ • ȱ ȱ ȱ £ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ûȱ ȱ £ȱ £ǯȱ ȱ ¢ȱ ȱ ȱ ȱ ǻǼȱ ȱ ȱ
ãȱ £ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ £ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱȱ£ȱãȱȱȱȱ£ǰȱȱȱȱǯȱȱ ȱ ȱ ǰȱ ȱ ȱ ȱ £ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱȱ ¡§ȱȱȱȱȱ §ȱȱ§ǯȱ ȱ ȱ ãȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ûȱ DZȱ ȱ • ȱ ȱ ȱ ¢ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ £ȱȱ ȱãȱǻǼǯȱ • ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ
ȱȱȱȱ ûȱȱǯȱ • ȱȱȱȱȱȱǯȱ ȱ ȱŗǯȱ §ȱǻǯȱȱȱǼǯȱȱ ȱȱȱ ȱȱ§ǰȱ§ǰȱǰȱ ȱȱ£ȱȱ ȱȱȱȱǰȱȱ ȱȱȱȱȱ§ǰȱȱ£ ȱ ȱȱȱȱȱǯȱ ȱ ȱ ȱ
8
Grundlegende Algorithmen mit Java
ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ãǰȱ ûȱ ȱ £ȱ ȱ ¢ȱ
ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ǰȱ ȱȱȱûȱȱȱŗȱȱȱ££ ǯȱ £ȱûȱ ȱȱȱ ȱǰȱ ȱȱȱȱǯȱȱȱȱ£ ȱ ¡ȱȱȱȱȱȱȱǯȱȱȱȱȱȱȬȱȱȱȬȱȱȱ §ȱ ȱ ȱ ŗǰȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ Ŗǰȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ƽȱ ǯȱ ȱ §ȱ ȱ ȱ ȱ ȱ ûȱ ȱȱŗȱȱǯȱȱãȱȱ ȱȱȱ¢ȱȱƽȱǿŗǰȱŘǰȱdzǰȱȀǰȱȱ∈ǿŗǰȱ ǯǯǰȱȀȱȱǯȱȱûȱȱǰȱȱȱȱ≠ȱǰȱ ȱȱƽȱŗȱǯȱȱ ȱȱȱȱǰȱȱ ȱȱȱȱǰȱȱȱ §ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ £ ȱ ȱ ȱ ȱ ȱ§ȱǯȱ ǯȱȱ ȱȱ ȱ[ȱȱřȱãȱȱ§ǰȱȱȱ §ȱȱȱDZȱ ȱ
ȱ ȱ ȱ§ȱȱ ȱ ȱȱȱ ȱ£ǯȱȱǰȱȱȱ ȱ£ ȱ ȱȱǯȱȱ ȱ ££¡ȱ ȱ ¢ǰȱ ȱ ȱ ȱ ƽȱ ȱ ûȱ ȱ ǰȱ ȱ zȱ ǿŗǰȱ Řǰȱ dzǰȱ ŗŖȀǯȱ ȱ ãȱȱȱǿȱÁ ÁÁ ÁÁ ÁȱȀǯȱ ȱ ȱ ȱ
1 Algorithmen – grundlegende Konzepte ȱȱ ȱ ȱ ȱ
1
4
7
2
5
3
6
8
9
9 ȱ££¡ȱş¡şȱ §0 1 0 0 0 0 0 0 0· ¨ ¸ ¨1 0 1 1 0 0 0 0 0¸ ¨0 1 0 1 1 1 0 0 0¸ ¨ ¸ ¨0 1 1 0 1 0 0 0 0¸ ¨ ¸ȱ ¨0 0 1 1 0 1 1 1 0¸ ¨0 0 1 0 1 0 0 1 0¸ ¨ ¸ ¨0 0 0 0 1 0 0 1 0¸ ¨0 0 0 0 1 1 1 0 1¸ ¨¨ ¸¸ ©0 0 0 0 0 0 0 1 0¹
ȱ ȱãȱ§ȱȱ ȱȱ ȱȱȱ§ȱȱȱ DZȱ ȱ ȱ 1 2 3 ȱ ȱ ȱ 5 6 4 ȱ ȱ ȱ 7 9 8 ȱ ȱ
ȱ
10
Grundlegende Algorithmen mit Java
ȱŘǯȱȱȱȬǯȱ ȱ ȱûȱȱȱȱ§ȱȱȱǯȱȱ ȱȱ ȱ£ǰȱ ȱȱ ȱȱȱ£ ǯȱ ȱǰȱȱ đȱȱǰȱȱ ȱȱȱȱȱȱ ȱȱ ȱ§ǯȱȱȱȱ ȱȱȱǰȱ ȱȱȱȱȱǰȱȱ ¢ȱ ȱ £ȱ ǯȱ ȱ ȱ ȱ ǰȱ ǰȱ §ȱ ǻ ãǰȱǰȱǼǰȱȱȱȱȱȱûȱȱ£ǯȱ ȱȱ ȱȱȱǰȱȱȱȱãȱûȱ ȱ ûȱ ǻȱ ȱ ȱ ȱ ȱ Dzȱ ȱ ȱ ȱ ȱ ȱ ȱ§ȱȱȱȱȱDzȱȱȱ §ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ Dzȱ ǯǯǯǼǯȱ ȱ ȱ §ȱ ȱ ȱ ȱ ǻȱ ȱ ãȱ ȱ ȱ ȱ §ǰȱ £ǯȱ ǯȱ ȱ ǰȱ ȱ Dzȱ ȱ ȱ ȱ ȱ £ȱ ȱ £ ȱ §ȱ Dzȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ £ȱ ¡ȱ ȱ ȱ Dzȱ ǯǯǯǼǯȱ ȱ ȱ ȱ ȱ §ȱ ȱ ǰȱ ãȱ ȱȱȱ ȱȱȱǯȱ
Eigenschaften eines Algorithmus • • • • • • •
ȱãȱȱǻȱǼȱ ȱȱȱǻȱǼȱ ȱ ǻȱ ȱ ûȱ ȱ ȱ ȱ £ ȱ ȱ §ȱȱȱǼȱ
ȱȱȱȱ£ȱȱȱ ȱ ǻȱ ȱ ȱ ûȱ ȱ £ȱ ȱ ȱ ȱȱȱȱǼȱ
¡§ȱ ǻ ǰȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ Ȭ £ǰȱȱ Ǽȱ ȱ ǻȱ ȱ ȱ ûȱ ȱ ȱ ȱ £ȱ ȱ ǰȱȱȱȱûǰȱȱûȱȱȱ Ǽǯȱ
Algorithmik ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¢ȱȱȱ§ǰȱȱȱȱ¢ȱȱ ȱǯȱ ŗǯ ȱǮ Ȅȱȱȱ£ ȱDZȱ • ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻȱ ǰȱȱȱȱ§ȱȱȱȱ ǰȱ ǯǼȱ
1 Algorithmen – grundlegende Konzepte
11
•
Řǯ
ȱ ȱ ǯȱ ȱ ȱ ȱ ûȱ ȱ £ȱȱ ȱûȱãȱǯȱ ȱȱ¢ȱȱȱ ȱȱȱ£ȱ ǰȱ ȱ ȱ ãȱ £ȱ ȱ £ȱ ȱ ȱ ãǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ §ȱ ǻ£ȱ §ȱǼǯȱ
ȱ ȱ ȱ ¢ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱȱȱȱǰȱȱ£ȱȱȱȱ £ȱ ǰȱ ȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ û£ȱ ȱ ûȱ ȱ ȱ ȱ ȱ §ȱ ǯȱ ȱ §ȱ ȱ ȱ ȱ ȱ ǻȱ ȱ Ǽǰȱ ȱ ȱ ȱ ȱ DZȱ ǰȱ ǰȱ ȱ ǰȱ Ȃȱ ǰȱ ǰȱ ǯȱ
Das RAM-Rechnermodell ȱ ȱȱȱ§ȱȱȱȱȱȱȱ ȱ ¢ȱ ǰȱ ȱ ȱ ȱ ȱ ǻǼȱ đǯȱ ȱ Ȭ ȱȱȱDZȱ • ȱǮȄȱȱǻƸǰȱȬǰȱȘǰȱȦǰȱƖǰȱƽǰȱȦ ǰȱȦǼȱãȬ ȱȱȱ£ ǯȱȱǯȱ • ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ ǯȱ ȱ ǯȱȱ£ȱȱȱȱȱȱ£ǯȱ ȱ §ȱ£ȱȱǰȱȱȱǻǼȱȱȱ££ ǰȱ ȱȱȱ§ȱǰȱȱȱȱ£ȱȱȱȱŗŖǯȱȱ ǰȱȱȱȱȱȱǻǼȱãǰȱ§ȱȱȱ £ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¢ȱ đȬ ǯȱ • ȱ £ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ Ȭ £ȱȱ£ȱûǯȱȱȱûȱǰȱȱȬ ȱ ȱ ȱ ȱ §ȱ ȱ ȱ ȱ ȱ ǻ£ǯȱ ǯȱ ȱ Ǽȱ ǯȱȱȱȱ¢ȱȱǯȱ ȱȱȬȱȱȱȱ£ȱȱȱǻǼǰȱȱûȱ ȱ ȱ ȱ £ȱ ǯȱ ȱ ȱ ȱ ȱ ȱȱȱ§£ǰȱ ȱȱȱȱ£ȱ ȱȱȱȬ ȱ£ȱȱ§ǯȱ £ȱȱȱǰȱȱȱȱ£ȱȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ǰȱ ȱ ȱ ûȱ §£ȱ£ȱãǯȱȱȱ ȱȱȱȱǰȱȱȱȱ ¡ȱȱȱȱȱȱȱȱǯȱȱȱȱȱ ǰȱȱȱȱȱǰȱȱȱȱȱȱȱȬ
12
Grundlegende Algorithmen mit Java
ȱ ȱ £ȱ ȱ £ ǯȱ ȱ ȱ ǯȱ £ȱ ȱ ȱ ȱ ȱȬȱȱȱǰȱȱȱȱȱȱ£ȱȬ ¢ǯȱȱȱȱ ȱȱȱ ȱȱȱ£ȱȱ §ȱȱ ǯȱȱ ȱ ȱȱȱ £ǰȱȱȱȱȱ£ȱ ȱǯȱȱ ȱ £ȱȱȱȱȱȱȱǯȱȱȱǰȱȱȱȱȱ ȱ ǰȱ ȱ ȱ ȱ §ȱ ãȱ ǯȱ ȱ ȱ ȱ ȱ £ǰȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ Ȭ ûȱûǰȱȱȱȱ ǯȱȱ §ȱȱǰȱȱȱ ȱ ȱ ¢ȱ ȱ ȱ ȱ ȱ £ǯȱ ȱ§ȱȱȱȱȱȬǯȱȱȱȱǰȱȱȱȬ ǰȱȱȱȱǰȱȱû£ȱǰȱȱȱȱȱȱ §ȱ£ȱǯȱȱ
Die Komplexität von Algorithmen ȱ ¡§ȱȱȱȱȱȱ ǰȱȱȱ ȱ ȱȱȱ ȱǻ£ǰȱãȬ ȱ ǰȱ £ȱ ȱ ȱ ǯǼǯȱ ȱ ȱ ȱ ȱ ȱ ¡ȱ ȱ ǰȱ ǰȱ ȱ ȱ £ȱȱȱȱ ȱǯȱȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱȱ ǻǼȱ ȱ ǰȱ ȱ ȱ £ȱ §ȱ ûȱȱȱȱȱȱȱǯȱȱȱ ȱȱȱȱȱȱȱǰȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻȱ ȱ £ȱ ȱ ȱ ȱ Ǽǰȱ ȱ ǻȱ ȱ £ȱ ȱ ȱ ȱ Ǽǰȱ ǰȱ ǰȱ ǰȱ Ȭ ǰȱȬȱ ǯȱǯȱ ȱ Die Ĭ-, O- und ȍ-Notation.ȱȱȱ ȱ ǰȱȱȱȱ ȱ ¡§ȱ ȱ ȱ £ȱ ¢ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱȱȱǯȱ ȱ Die Ĭ-Notation (konstante Kategorie – same order).ȱȱȱȱȱ ȱ Ŗȱ zWȱȱŗǰȱŘȱzȱ[ȱǰȱûȱȱȱȱȱǻǼȱûȱȱûȱȱǰȱȱ ãđȱȱŖȱǰȱȱ£ ȱŗȱȉȱǻǼȱȱŘȱȉȱǻǼȱǰȱȱȱ ǰȱȱȱ zȱ̋ǻǼȱǯȱ
1 Algorithmen – grundlegende Konzepte
13
ȱ ȱ̋ȬDZȱ∃ŖǰȱŗǰȱŘȱ∀ȱ≥ȱŖDZȱŗȉǻǼȱ≤ȱǻǼȱ≤ȱŘȉǻǼȱȱ ȱ Die O-Notation (obere Schranke – upper bound). ȱ ǰȱ ȱ ǻǼȱ zȱ ǻǻǼǼȱ ǰȱ ȱȱȱȱ ȱŖȱzWȱȱȱz[ȱǰȱûȱȱȱȱȱǻǼȱûȱ ȱûȱȱǰȱȱãđȱȱŖȱǰȱȱȱȱȉǻǼȱǯȱ ȱ
ȱ ȱȬDZȱ∃Ŗǰȱȱ∀ȱ≥ȱŖDZȱǻǼȱ≤ȱȉǻǼȱ Die ȍ-Notation (untere Schranke – lower bound).ȱ ȱ ǰȱ ȱ ǻǼȱ zȱ ̛ǻǻǼǼȱ ǰȱ ȱȱȱȱ ȱŖȱzWȱȱȱz[ȱǰȱûȱȱȱȱȱǻǼȱûȱ ȱûȱȱǰȱȱãđȱȱŖȱǰȱȱãđȱȱȉǻǼȱǯȱ ȱ
14
Grundlegende Algorithmen mit Java
ȱ ơ̇̄ȬDZȱ∃Ŗǰȱȱ∀ȱ≥ȱŖDZȱǻǼȱ≥ȱȉǻǼȱ
Optimalität, Reduktion, Beispiele ȱ ¡§ȱȱȱȱȱȱǻǼǰȱȱȱ£ȱȱãȬ ȱȱǻȱȱ£ǼȱȱȱûȱȱȱȱȱȱȬ §ǯȱȱȱ£ ȱȱȱȱDZȱ ǯ ȱ ¡§ȱ ȱ ûȱ ȱ ǻǯȱ Ȭȱ ¡¢ǼDZȱ ȱ£ȱȱȱȱȱȱ§ȱȱȱȱȱ ǯȱ ǯ ȱ£ȱûȱȱȱȱȱȱȱȬ ȱȱ£ȱȱ£ȱȱǯȱ ȱ ȱ ȱǰȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ Ȭ §ȱǰȱ£ǰȱ ȱȱȱȱȱ§ȱȱȱȱ ǻǯȱ ȬǼǯȱ ȱ ȱ §ȱ ȱ ȱ ¡§ȱ ȱ ǻǼȱ ȱ ȱ ȱ ǻǻǼǼȱ ǰȱ ȱ ǻǼȱ ȱ ȱ ȱ ȱ ȱ DZȱ ȱ ǻȱ
¡§Ǽǰȱ ǻǼȱ ǻȱ ¡§Ǽǰȱ ȱ ûȱ ≥Řȱ ǻ¢ȱ
¡§Ǽǰȱȱǻ¡ȱ ¡§ǼǰȱǷȱǻȱ ¡§Ǽǯȱȱȱ ȱȱȱȱ £ ȱȱȱ¢ǯȱûȱȱ £ǰȱ ȱ ȱ £ ȱ ȱ ǻǼȦǻǼȱ ûȱ ȱ ȱ ȱ ¡ȱ ȱ ȱǰȱȱǻǼȱȱȱǻǻǼǼǯȱDZȱ ŗǯ
Řǯ řǯ Śǯ
n = 0 ȱmȱ n ȱzȱǻǼȱ n→ ∞ n n lim = ∞ mȱȱ{ȱǻ n Ǽȱ n →∞ n n 1 lim = mȱȱzȱǻŘǼȱ n → ∞ 2n 2 2n lim = 2 mȱŘȱzȱǻǼȱ n→∞ n
lim
1 Algorithmen – grundlegende Konzepte
15
ȱȱȱđȱȱ §ǰȱȱȱȱûDZȱ ǻǼȱǀȱȱǀȱȱȉȱǻǼȱǀȱŘȱǀȱřȱǀȱŘǰȱȱȱȱǻǻǼǼȱ£ȱǻǼȱ£ȱǻȱǻǼǼȱ£ǻŘǼȱ £ȱǻřǼȱ£ȱǻŘǼǯȱȱ DZȱŗŖȱƸȱśȱǻǼȱƸȱŞȱȱ∈ȱǻǼǰȱŞȱ∈ȱǻŘǼǰȱŜśȱȱ∈ȱǻŗǼǰȱŗŖŖŖȱȱ∈ȱǻŘǼǯȱ ȱ ȱȱ ¡§ȱȱȱȱ ǰȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱûȱȱȱȱȱȱǰȱ ȱ ȱ ¡§ȱ ȱ ȱ ȱ ûȱ ȱ ¡§ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ãǯȱ ȱ ȱ ûȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱȱȱȱȱǰȱȱûȱȱȬ n ȱ §¨ ·¸ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ¨ 2¸ © ¹ ȱ ȱ ȱ ¡§ȱ ǻŘǼǯȱ ȱ ãȱ ȱ £ǰȱ ȱ ȱ ȱȱ ¡§ơ̇̄ǻŘǼȱǯȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǰȱ ȱ ȱ ¡§ȱ ȱ Ȭ ȱ ȱ ȱ ȱ ȱ ȱ §ȱ ȱ £ȱ ǯȱ ǰȱ ȱ ȱ ȱ ȱ ȱûȱȱȱȱȱȱ ûȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱȱȱȱȬ ǰȱȱ ȱȱȱ ȱãȱȱȱǰȱȱȱȱȱ ȱãǰȱȱȱȱȱȬ ȱ ȱ ȱ ǯȱ ȱ ȱ§ȱ ȱ ȱ ȱ ȱ ¡ȱ ûȱ ȱ ȱȱȱȱȱ£ȱǻ ¡§DZȱ̋ǻȱǻǼǼǼǯȱ DZȱǻȱƸȱǻǼǼȱƽȱǻǼǰȱȱǻǼȱǀȱǰȱǻǷȱƸȱřǼȱƽȱǻǷǼǰȱȱřǀǷǯȱ ȱ ȱ ȱ ȱȱȱȱȱ ¡§ȱȱ££ȱȱȬ ȱ¢ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
16
Grundlegende Algorithmen mit Java
¢ȱȱ ¡§ǯȱ ȱȱȱȱDZȱ ŗǯ ȱȱ Řǯ ȱ←Ŗǰȱȱ←ȱŖǰȱȱ←ȱŖȱ řǯ ȱǻȱȱǀȱȱǼȱȱ ȱȱȱ ȱ ȱȱȱ←ȱȱƸȱŗȱ ȱ ȱ ȱȱȱȱȱ←ȱȱȮȱŗȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ←ȱȱƸȱŗȱ ȱȱȱȱȱȱȏȱ Śǯ ȱ←ȱŖȱ śǯ ȱǻȱȱǀȱřȱǼȱȱ ȱȱȱ ȱ ȱ←ȱȱȬȱŗȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱȱȱȱȱ←ȱȱƸȱŗȱ ȱȱȱȱȱȱȏȱ Ŝǯ ȱǰȱȱ
ȱŘȱȱřȱǯȱ ȱ ȱ ȱ ȱ řȱ ûȱ Ř ǰȱ ȱ ȱ ȱ ř ȱ ǰȱ ãȱ ȱ ȱŜȱǯȱ ȱŚȱȱȱǯȱ ȱ ȱ śȱ ȱ Řȉřȱ ǰȱ řȱ ȱ ȱ řȱ ȱ ǰȱȱȱŗŘȱǯȱ ȱ DZȱřƸŜƸŗƸŗŘȱƽȱŗŞƸŚȱ ȱđȱȱ ¡§ȱȱǻǼǯȱ
ȱ ¢ȱ ȱ ¡§ȱ ȱ ££ǯȱ ȱ ȱ ȱ ȱ ǰȱ ȱȱȱãDZȱȱȱȱȱŗȱƸȱŘȱƸȱǯǯǯȱƸȱǯȱȱ ȱ
ȱȱ ȱ←ȱŖȱ ȱǻȱ←ȱŗǰȱǼȱ ȱȱȱȱ←ȱȱƸȱȱ Ƹŗȱ ǰȱȱ ȱȱȱȱȱ ȱ ȱ ȱ DZȱŘȱƸȱŗȱ ǻǼȱ
ȱȱ ȱ←ȱŖȱ ȱǻȱȱ←ȱŗǰȱȱǼȱȱ ȱȱȱǻȱȱ←ȱŗǰȱȱǼȱ ȱȱȱȱȱ←ȱȱƸȱŗȱ
ŗƸǻƸŗǼȦŘȱ ȱ ȱȱȱȱǻƸŗǼȦŘȱȱ ȱ ȱ ȱ DZȱŘȱƸȱȱƸȱŗȱ ǻŘǼȱ
ȱȱ ȱ←ȱȘǻƸŗǼȱȦȱŘȱ
ŗȱǰȱȱ ŗȱǰȱȱ ŗȱǰȱȱ ŗȱ ȱ ȱ DZȱŚȱ ǻŗǼȱ
ȱ ȱ ȱ ȱ §ȱ ȱ ȱ ûȱ ȱ ǯȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ £ȱȱȱǯȱ ȱ ȱ ȱ ȱ
1 Algorithmen – grundlegende Konzepte
17
Wachstum von O(g(n)) – vergleichendes Beispiel ȱ
ŗŖȱ ŗŖŘȱ ŗŖřȱ ŗŖŚȱ ŗŖśȱ ŗŖŜȱ
ǻȱǼȱ
ȱȱȱǻǻǼǼȱǻȱDZƽȱǼȱ ȱ ȱȱȱ Řȱ ȱ ȱȱ ǻȱǼŘȱ
Řȱ řȱ řȱ Śȱ Śȱ Śȱ
řȱ ŝȱ ŗŖȱ ŗřȱ ŗŝȱ ŘŖȱ
ŗŗȱ ŚŚȱ şşȱ ŗŝŝȱ ŘŝŜȱ řşŝȱ
ŗŖȱ ŗŖŖȱ ŗŖŖŖȱ ŗŖǯŖŖŖȱ ŗŖŖǯŖŖŖȱ ŗǯŖŖŖǯŖŖŖȱ
řřȱ ŜŜŚȱ şşŜŜȱ ŗřŘǯŞŝŝȱ ŗǯŜŜŖǯşŜŚȱ ŗşǯşřŗǯśŜşȱ
ŗŖŘȱ ŗŖŚȱ ŗŖŜȱ ŗŖŞȱ ŗŖŗŖȱ ŗŖŗŘȱ
Řȱ
Ƿȱ
ŗŖřȱ ŗŖřŖȱ ŗŖřŖŗȱ ŗŖřǯŖŗŖȱ ŗŖřŖǯŗŖřȱ ŗŖřŖŗǯŖřŖȱ
ŗŖśȱ ŗŖşŚȱ ŗŖŗŚřśȱ ŗŖŗşřřśȱ ŗŖŘŚřǯřřŞȱ ŗŖŘǯşřřǯřŜşȱ
¡§ȱûȱȱDZȱ ŗǯ ȱȱ ǰȱȱȱȱȱȱ ¡§ȱǻǻȱ ǼǻȱǼǼȱ ǯȱ Řǯ ȱ ¡§ȱûȱȱȱȱȱǻǼǰȱ ȱȱûȱȱȱ ȱȱ ȱûǯȱ řǯ ûȱȱ§ȱȱ§ȱȱ ¡§ȱǻȱǼǰȱ ȱȱûȱ ȱǻŗȱƸȱȱǼȱȱûȱ ǯȱȱ Śǯ ȱ §ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ §ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ãȱ
ȱ ȱ ǻȱ ¡ȱ Ǽǰȱ ȱ £ȱ ȱ ȱ ǻȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱ ȱȱȱȱȱȱȱǼǯȱȱ
¡§ȱȱȱ¡DZȱǻǼǯȱȱ
Die reelle Zeit eines Algorithmus (polynomial vs. exponentiell) ȱ ȱ ȱ £ȱ ǰȱ ȱ ȱ ȱ ȱ £ȱ §ǰȱ ȱ ǻǼȱ ȱ ǻȱ ȱ ȱ Ǽȱ ȱ ȱ ȱ ûȱ ǰȱȱȱȱ£ȱȱȱȱȱȱȱǯȱȱ µsȱȱŗŖȬŜȱǯȱ ȱȱȱȱ ȱǻ¢ȱȱ¡ȱǼȱ ȱ
ȱ śȱ ŗŖȱ ŘŖȱ śŖȱ ŗŖŖȱ
ǻǼȱƽȱȱ ǻǼȱƽȱȱǻǼ ŖǯŖŖśȱΐȱ Ŗǯŗȱΐȱ ŖǯŖŘȱΐȱ ŖǯŖśȱΐȱ Ŗǯŗȱΐȱ
ŖǯŖŗȱΐȱ ŖǯŖřȱΐȱ ŖǯŖşȱΐȱ ŖǯŘŞȱΐȱ ŖǯŜŜȱΐȱ
ǻǼȱƽȱŘȱ ǻǼȱƽȱřȱ ŖǯŖřȱΐȱ Ŗǯŗȱΐȱ ŖǯŚȱΐȱ Řǯśȱΐȱ ŗŖȱΐȱ
Ŗǯŗřȱΐȱ ŗȱΐȱ Şȱΐȱ ŗŘśȱΐȱ ŗŖŖŖȱΐȱ
ǻǼȱƽȱŘȱ ŖǯŖřȱΐȱ ŗȱΐȱ ŗŖŖŖȱΐȱ ŗřȱȱ Śȱ¡ȱŗŖŗřȱ ȱ
18
Grundlegende Algorithmen mit Java
ȱ ǰȱ ȱ ûȱ ȱ ≥ȱ śŖȱ ȱ £ȱ ûȱ ǻǼȱ ƽȱ Řȱ ȱ £ȱ đȱ ǯȱ ȱ ȱȱȱȱȱȱȱȱȱȱãǰȱ ûȱȱ ûȱȱƽȱŗŖŖȱȱŚŖǯŖŖŖǯŖŖŖȱ ȱ§ȱǯȱ
Klassifizierung der Probleme (P, NP, NP-vollständig, NP-hart) ȱ ȱ ȱ ȱ ¡§ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ǻȱ ȱ Ǽǯȱ ȱ ȱ ȱ ȱ ȱ Ȭȱ ȱ ȱ Ȭȱ
£ǯȱ Ȭ§ȱ ȱ Ȭȱ ȱȱȱǯȱȱȱȱȱ £ûȱȱȱȱȱ£ȱǰȱ ȱ ȱ £ȱ ȱ
ȱ ȱ ǯȱ ȱ ȱ đȱ ȱ ȱ ǰȱ ȱ ãȱ ȱ ȱ ȱ ǯȱ £ȱ ãȱ £ȱ ȱ ȱ ȱ £ ǯȱ ȱ ǰȱ ȱ ȱ ȱ ȱ £§ȱ ȱ ǻǯȱ ǯǰȱ ȱ ȱ £ ȱ ȱ £ ȱ ȱ ȱ ȱ Ǽǯȱ ȱ ȱȱȱ ȱȱȱ ȱȱ ȱ ȱǻȱǰȱȱȱ ȱǼǰȱȱȱȱDZȱǮȱ ȱ£§ǵȄǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ãȱ ȱ ȱ ȱ ûûȱ ǯȱ ȱ ȱ ȱ ȱ ȱ
ȱ ǻȱ Ȯȱ ȱ ȱ Ǽȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱ ȱȱȱǯȱȱȱDZȱǮȱ ȱȱȱȱ ȱ§ǰȱȱȱȱȱ ȱǵȄǯȱ ãȱȱȱȱ ȱ ȱȱȱǯȱ ȱ ȱ ȱ ȱ ãȱ ȱ ǰȱ ȱ ȱ ¢ȱ ãȱ Dzȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ NP ȱãȱǻǼȱ ǯȱȱȱ ȱ P ȱ ȱ ȱ ȱ ȱ ȱ £§£ȱ ȱ ǰȱ ȱ ȱ ǮȬȱ ¢Ȅȱ ãȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱDZȱûȱȱ£ȱȱǰȱȱȱȱǮ Ȅȱãȱ ǰȱȱ ȱȱȱȱ¢ȱȱûûȱ ǯȱȱȱ£ȱ ȱ ȱ ȱ Ǯȱ ȱ ȱ ȱ ȱ Ȃȱ ǵȄǯȱ ȱ £ȱ Ǯ Ȅȱ ȱ ȱ ȱ ȱ £ǰȱ ûȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ûȱ ȱ £ȱ ȱ ȱ ȱ ȱ ǻȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ Ǽȱ ȱ ȱ ȱ ȱ Ȃȱ ǯȱ ȱ ȱ ȱ ǰȱ £ȱ ûǰȱ ȱ ȱ ȱ ȱ Ȭ
1 Algorithmen – grundlegende Konzepte
19
ȱ£ ȱ ȱȱ Ȃȱǰȱǯȱǯǰȱȱȱûȱȱ ȱǿǰȱȀȱȱ ȱȱ ȱ ǿǻǼǰȱ ǻǼȀȱ ȱ Ȃȱ ȱ ȱ Ȃȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ¢ȱȱȱ£ȱȱȱ ȱ ȱȱ Ȃǯȱ ȱãȱȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ǰȱ ȱ ȱ ȱ ȱ §ȱ ǯȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ƽŗŖŖȱ ǰȱ ȱ ȱȱ ȱǮ Ȅǰȱȱȱȱȱȱ ȱȱ¡ȱŗŖŖȱȱ ǰȱ ȱ ȱ ȱ ǻȱ ǰȱ ȱ ȱ ȱ ȱ ȱ §ȱ ȱ ȱȬȱȱȱȱǰȱȱȱûȱȱ ȱ ȱ ȱǼȱȱ ȱǯȱȱȱȱȱȱ ǰȱȱȱ ȱȱȱ ¢ȱ£ȱȱǰȱȱȱ ȱ£ȱȱǮ Ȅȱǯȱ ȱ ȱ ȱ ȱ ¢ȱ £ ȱ ȱ ȱ ȱ Ǯ Ȅȱ ȱ ǮȄǯȱ ȱ ȱ £ȱ û£ǰȱ ȱ ȱ ȱ Ǯ Ȅȱ ǰȱ ûȱ ǰȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ ãȱ ãȱ ûǯȱ ȱ ȱ ȱ ǮȄȱ ǰȱ ȱ ȱ £ȱ ǻ ȱ ûȱ ȱ ãȱ ȱ ûǰȱ ȱ ȱ ȱ ǰȱ ȱȱãǼǯȱȱ ȱȱȱȱȱȱ ǰȱ ȱ ȱ ȱ £ãȱ ȱ Ȭǯȱ ûȱ ȱ ȱ ȱ
ȱȱȱȱȱDZȱǮ ȱ ȱãȱȱȱ ȱȱ§ȱãđȱȱ ǵȄǯȱȱ ȱȱȱǰȱȱǰȱȱȱȱ ȱ £ȱ ȱȱȱ£ȱ ȱ Ȭȱãǰȱ ȱûȱ ȱ ȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ ȱ ǻǮ ȄǼǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱȱ ȱȱȱȱȱDZȱ Ǯȱ ȱ £ȱ ȱ ȱ ȱ ȱ
ǰȱ ȱ ȱ §ȱ ȱ ȱ ȱ ǰȱȱǵȄǯȱ
Probleme NP-vollständig (NP-complete) ȱ £ȱ ȱ ȱ ȱ ¢ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ǯȱ NP ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱȱȱǯȱ£ȱ£ȱȱ NPC P ȱ ȱ ȱ ãȱ ȱ ǯȱ ȱ
ȱ ȱ ȱ ȱ ȱ ǰȱȱȱȱȱ ȱǯȱ ȱ ȱ đȱ Ȭ§ȱ ǻǯȱ ȬǼǰȱ £ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ £ȱȱǰȱȱȱ£ȱȱ ȱȱ£§ǰȱȱȱ £ȱȱǯȱȱ
20
Grundlegende Algorithmen mit Java
ȱȬ§ȱDZȱ • Ȭȱ ǻ ȱ ȱ ǼDZȱ ȱ £ ȱ Ȭ ȱ ȱǵȱ • §ȱ ǻ ȱ ȱ ǼDZȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ≥ȱ ŗȱ ǯȱ DZȱ ȱ Ȭ§ȱ ȱ Ȭ ȱ ȱȱȱãǰȱȱ ȱȱ ȱȱȱȱȱŗǰȱŘǰȱ dzǰȱȱ£ȱ§ǰȱȱȱ ȱȱȱǯȱ ȱ ȱȱȬ§ȱȱ ǵȱ • ȱ DZȱ ¡ȱ ȱ ȱ ûȱ ȱ ȱ ȱ §ǰȱ ȱȱ§ȱȱȱȱȱǰȱȱȱȬ ȱȱǵȱ • ȱǻȱȱǼDZȱȱȱȱȱȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱȱȱȱȱȱ ȱǵȱ • ûȱǻȱȱǼDZȱȱȱȱȱǰȱ ȱȱȱȱȱȱȱȱûȱȱȱǯȱ ȱ ȱȱãǰȱȱȱȱȱ¡ȱȱȱȬ £ǵȱ • ȱǻ ȱǼDZȱȱȱȱȱȱȱ £§ȱ ǰȱȱȱȱȱȱȱ ãđȬȱȱ ȱȱȬ ȱȱȱȱǯȱ ȱȱȱȱȱǰȱûȱȱǰȱ ȱȱȱȱãȱȱđȱȱȱȱ ȱǵȱ
Das Erfüllbarkeitsproblem (SAT) ȱ ȱ ȱ ȱ ȱ ûȱ ŗşŝŗȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¢Ȭ ȱ ȱ ¢ȱ ȱ ǰȱ ǯȱ ŗśŗȬŗśŞǰȱ ǯȱ ȱ Ȭ ȱ ǰȱ ȱ ȱ ȱ ȱ ûȱǻǰȱȱengl. satisfiabilityǼǰȱȱ ȱ ȱ ȱ ǰȱ Ȭ§ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ Ȭȱ ȱ ȱ ǰȱ ȱ ȱ ȱ Ȭ§ȱ ȱ ãȱ ǰȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ Ȭ§ȱ ȱ ãǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Prof. Dr. Stephen Arthur Cook ȱ DZȱ ȱ ȱ ȱ (geb. 1939) ¢ȱ ȱ ǰȱ ȱ ȱ ȱ ȱȱ ȱȱãǰȱȱ¡ȱûȱȱȬ ȱȱ¢ȱȱȱãǯȱȱ
1 Algorithmen – grundlegende Konzepte
21
ȱ ȱ Ȭǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ¡§ȱ DZȱ ȱ ȱ ȱ ȱ ȱ ûǵȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ£ȱȱǰȱûȱȱȱȱ ȱǵȱȱ ȱ ǯȱȱǰȱȱȱȱȱǻ Ǽȱǰȱȱȱȱ ȱ ( y11 ∨ y12 ∨ ... ∨ y1n1 ) ∧ ( y11 ∨ y12 ∨ ... ∨ y1n 2 ) ∧ ... ∧ ( y11 ∨ y12 ∨ ... ∨ y1n m ) ǰȱ ȱ ȱȱ¢ȱȂȱȱȱȱȱǿ¡ŗǰȱ¡Řǰȱdzǰȱ¡ǰȱ"¡ŗǰȱ"¡Řǰȱdzǰȱ"¡Ȁȱ ǯȱȱ ȱ ȱȱȱȱ Ȭȱ ȱƽȱǻ¡ŗȱ∨ȱ"¡ŘǼȱ∧ȱǻ¡Řȱ∨¡řǼȱ∧ȱǻ"¡ŗ∨"¡Ř∨"¡řǼȱ∧ȱǻ¡ŗ∨"¡řǼȱ ǰȱȱ ȱûȱ ǰȱȱȱȱ ȱȱȱ¡ŗǰȱ ¡Řǰȱ ¡řȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ǰȱȱ ȱȱ£ ȱȱ ȱǯȱ ȱ ¡ ŗȱ ¡Řȱ ¡řȱ ȱ Ŗȱ Ŗȱ Ŗȱ Ŗȱ Ŗȱ Ŗȱ ŗȱ Ŗȱ Ŗȱ ŗȱ Ŗȱ Ŗȱ Ŗȱ ŗȱ ŗȱ Ŗȱ ŗȱ Ŗȱ Ŗȱ Ŗȱ ŗȱ Ŗȱ ŗȱ ŗȱ ŗȱ ŗȱ Ŗȱ ŗȱ ŗȱ ŗȱ ŗȱ Ŗȱ
Die Klasse der NP-harten Probleme ȱȱȱ ȱȬȱȱȱȱȱȱ ǰȱ ȱȱȱȱ ǰȱȱȱȱȱȱ ȱȱ ȱ ȱ Ȭǯȱ Ȭȱ ȱ £ȱ ȱ ȱ ǰȱ ȱ ȱ Ȭ§ȱ ȱ ǻ ȱ ȱ ȱ ȱ ȱ
Ǽǯȱȱȱȱǰȱȱȱ£ȱûȱȱȱ ȱ ȱ ãȱ £ȱ ǰȱ ǯǯȱ ȱ ȱ ȱ ãǰȱ ȱ ȱãȱ£ȱǯȱȱȱ£ȱ ȱȱ ȱȱȱȱ ȱǰȱȱûȱȱȱãȱǰȱȱǮȱȱ ȱ ãȄȱ ǯȱ £ȱ ãȱ ǯǯȱ §ȱ ǰȱ ûȱ £ȱ ȱ££¢ȱ¢ǰȱȱȱȱȱûȱȱǯȱ
22
Grundlegende Algorithmen mit Java
Aufgaben ŗǯ
ȱ ȱ ȱ ȱ ǵȱ §ȱ ȱ ȱ ȱ ȱ ȱǯȱ Řǯ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱȱǰȱȱȱȱȱȱŘřŘŘȱȱŜśŚȱ£ȱǯȱ řǯ ȱ ǰȱ ȱ £ ȱ ûȱ ȱ £ ȱ £ȱ ǯȱ Śǯ ȱ ȱ ȱ ǰȱ ȱ £ȱ ȱ ȱ ȱ ¡ȱȱȱ£ȱǯȱȱ ¡§ȱȱǵȱ śǯ ȱȱȱȱȱûȱȱ£ȱȱȱ§ȱǯȱ ȱ ¡§ȱ ȱȱǵȱȱȱȱǰȱȱ ȱ§ȱȱǵȱ Ŝǯ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¢ǻǼȱ ȱ ȱ ǯǯȱȱǯǯ¢ȱȱȱ ȬȬȱȱȱ ȱȱȱǰȱȱȱȱ ǯȱ ŝǯ ȱȱȱǰȱȱȱȱ £ȱȱȱǵȱ Şǯ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ £ǯȱ
DZȱ ȱ ãȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ǰȱ ȱ ȱȱȱȱǯȱ şǯ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǵȱȱ ŗŖǯ ȱȱȱ §ȱȱ ȱȱȱǵȱ ŗŗǯ ȱȱ£ȱȱǵȱ ŗŘǯ ȱȱȱȱȱ ȱ£ ǯȱȱ¢ȱȱǵȱ ŗřǯ ȱ ȱ ȱ ȱ ȱ ǵȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǯȱ ŗŚǯ ȱ ȱ ȱ ¡§ȱ ȱ ǵȱ ȱ ȱ ȱ ȱ ̋ǰȱȱơ̇̄ȱǯȱȱ ŗśǯ ȱ ȱ ȱ ȱ ȱ ȱ ȱ §ȱ ȱ ǵȱ ȱȱȱûȱȬ§ȱǯȱȱ ŗŜǯ ȱ ȱ ȱ Ȭǯȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱȱȱȱ ȱȬ§ȱǵȱ ŗŝǯ ȱȱȱ ȱȱȬȱǵȱ ŗŞǯ ȱȱȱ ȱǵȱ ȱȱȱȱȱȱȱȱǯȱŘȱ∈ǻřǼȱȱȱȱȱȱǯȱřȱ∈ǻŘǼȱȱȱȱȱǯȱŘƸŗȱ∈ȱǻŘǼȱȱȱȱǯȱǻƸŗǼǷȱ∈ȱǻǷǼȱ ŗşǯ §ǯȱȱȱȱ ǰȱȱ§ȱȱȱ £ȱ £ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǰȱ ȱ £ȱ §ȱ £ȱûǯȱȱȱûȱȱ§ȱȱŚȱȱDZȱ
1 Algorithmen – grundlegende Konzepte
§ ȱ ȱ §ȱȱȱȱ DZȱ ȱ ȱ
ȱ ȱ
23
24
Grundlegende Algorithmen mit Java ŘŖǯ ȱȱȱ ¡§ȱȱȱDZȱ ȱ ȱȱȱ←ȱŗǰȱȱȱ¡ȱ ȱȱȱ←ȱŗǰȱȱȱ¡ȱ ȱȱȱ←ȱŗǰȱśȱ¡ȱ ȱȱȱ←ȱŗǰȱƸŗȱ¡ȱ ȱȱȱǿȱȀȱ ȱȱȱǿȱȀȱ ȱȱȱ←ȱŗǰȱȱȱ¡ȱ ȱȱȱ←ȱŗǰȱȱȱ¡ȱ ȱȱȱ←ȱŗǰȱŜȱ¡ȱ ȱȱȱ←ȱŗǰȱȱ¡ȱ ȱȱȱȱ←ȱŗǰȱȱ¡ȱȱȱ ȱȱȱȱȱ←ȱŗǰȱȱ¡ȱ ȱȱȱȱǿȱȱȱȀȱ ȱȱȱȱȱȱȱǿȱȱȱȀȱ
ȱ
ȱȱǰȱ§ȱ
ȱ
Verschachtelte Schachteln
2
ȱ ȱ ȱȱ ȱȱ ȱȱȱȱ¢ȱȱ ǯȱ ȱ ȱ §ȱ ȱ ȱ ȱ ȱ ȱ ¢ȱ ȱȱ ȱȱãǰȱȱȱȱ£ȱȱûǯȱȱȬ ȱ ȱ ȱ Ȭǰȱ ȱ đȱ £ûȱ ȬȦȬȱ ¢ȱ ǯȱ
Problembeschreibung ȱ ȱ ȱ Ȭȱ ǯȱ ȱ ȱ £ ȱ ȱ ǰȱ ȱ ȱȱǻŘǰȱřǼȱȱȱȱȱ§ȱřȱȱ ȱ ȱ Řȱ §ǯȱ ȱ ȱ Ȭ ȱȱȱȱȱǻŚǰȱŞǰȱşǼȱȱȱ ȱ §ȱ Śǰȱ ȱ ȱ Şȱ ȱ ȱ ãȱ şȱ §Ȭ ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £Ȭ ǰȱȱ ȱãȱȱǯȱȱȬ ǰȱ ȱ ȱ ȱ ȱ ƽȱ ǻŗǰȱ Řǰȱ ǯǯǯǰȱ Ǽȱ ȱ ȱ ȱ ȱ ƽȱ ǻŗǰȱ Řǰȱ ǯǯǯǰȱ Ǽȱ ǰȱ ȱ ȱ ȱ ȱ πȱ ȱ ǿŗǰȱ Řǰȱ dzǰȱ Ȁȱ ǰȱ ȱ ȱ aπ (i ) < bi ȱ ûȱ ȱ ȱ ∈ȱ ǿŗǰȱ Řǰȱ ǯǯǯǰȱ Ȁǯȱ ȱ đǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ §ȱ ǯȱ ȱ ȱ ȱ §ȱ ȱ ȱ ȱ ǰȱ ȱ ȱǯȱȱȱŗǰȱŘǰȱǯǯǯǰȱȱȱȱȱȱǰȱ ȱȱ ȱȱȱȱȱƸŗȱǻŗȱ≤ȱȱǀȱǼȱǯȱȱ ȱȱȱȱȱȱƽȱǻŘǰȱŜǼȱȱȱȱȱƽȱǻŝǰȱřǼǰȱ ȱȱȬ ȱȱȱȱ ȱãȱ£ȱȱƽȱǻŜǰȱŘǼȱȱȱȱȱȱ ȱȱȱȱȱǯȱȱȱȱƽȱǻşǰȱśǰȱŝǰȱřǼȱȱȱȱȱ ȱ ȱ ƽȱ ǻŘǰȱ ŗŖǰȱ Ŝǰȱ ŞǼǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûǯȱȱȱȱȱƽȱǻşǰȱśǰȱŝǰȱŗǼȱȱȱȱȱǰȱ ȱȱȬ ȱ£ȱǻŗǰȱşǰȱśǰȱŝǼȱȱ ȱãȱȱȱȱȱȱȱȱ ȱȱǯȱ DZȱȱȱȱǯȱȱȱȱȱȱǯȱ ȱȱȱ ȱȱǰȱȱȱ£ȱȱȱȱȱȱȱȱǯȱ ȱȱȱȱȱȱȱȱȱȱ ȱǯȱȱ
26
Grundlegende Algorithmen mit Java
DZȱȱǰȱ ȱûȱȱ¡ȱȱȱȱǰȱȱȬ ȱǯȱûȱȱ ǰȱȱȱȱȱ¡ȱȱǰȱ ȱ ȱȱȱȱǰȱ ȱȱǯȱ£ȱȱǯȱȱ¡ȱ£Ȭ £ȱ §ȱȱȱȱŘśŖǰȱȱȱȱŗǯȱȱ¡ȱ£ȱ ȱȱȱȱ£ȱȱřŖŖǯȱȱȱǰȱȱȱȱȱ Ƿȱ DZȱ ȱ schachteln.in schachteln.out 5 2 Laenge: 4 -------------3 7 3 1 4 5 8 10 ******************************* 5 2 12 7 Laenge: 4 21 18 8 6 -------------7 2 5 8 5 2 20 1 30 10 ******************************* 23 15 7 9 11 3 40 50 34 24 14 4 Laenge: 5 9 10 11 12 13 14 -------------31 4 18 8 27 17 5 4 2 7 9 44 32 13 19 41 19 ******************************* 1 2 3 4 5 6 80 37 47 18 21 9 9 5 7 14 2 1 3 49 80 15 50 10 90 53 17 60 11 4 3 2 15 10 1 2 3 4 5 6 7 8 9 10 89 53 17 60 11 3 2 1 14 9 92 54 65 19 15 ǻȱȱȱȱŗşşŖǰȱȱǯȱȱ¡Ǽȱ
Problemanalyse und Entwurf der Lösung £ȱŗǯȱ ȱȱȱȬȱȱȱƽȱǻŗǰȱŘǰȱdzǰȱȬŗǰȱǼȱȱȱƽȱǻŗǰȱ ŘǰȱdzǰȱȬŗǰȱǼȱȱȱȱȱ ≤ȱƸŗǰȱȱ ≤ȱƸŗȱûȱȱȱȱŗȱȱȬŗȱǻȱȬ ȱ ȱ ȱ Ǽǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱǰȱ ȱȱǀȱȱûȱȱ∈ǿŗǰȱŘǰǯǯǯǰȱȀǯȱ ǯȱȱ£ȱȱ ȱȱǯȱȱȱȱǰȱȱȱȱȱ ȱȱȱȱ∈ǿŗǰȱŘǰǯǯǯǰȱȀȱǰȱȱȱ ȱ≥ȱ ȱǯȱ ȱȱȱȱ ȱȱ
2 Verschachtelte Schachteln
27
ȱDZȱȱǀȱȱûȱȱ∈ǿŗǰȱŘǰǯǯǯǰȱȬŗȀȱȱȱ≥ȱȱǯȱȱȱȱȱ ȱǰȱǰȱȱȱȱ≥ȱȱȱûȱȱ∈ǿƸŗǰȱǯǯǯǰȱȀȱǯȱȱ£ȱãǰȱȱ ȱȱȱȱȱȱ v[i]) { v[i] = v[j] + 1; vPred[i] = j; } } if (v[i] > v[indexMax]) { indexMax = i; } } out.print("Laenge: "); out.println(v[indexMax]); StringBuilder bf = new StringBuilder(); for (int currIdx = indexMax; currIdx >= 0; currIdx = vPred[currIdx]) { bf.insert(0, ' ').insert(0, (boxes[currIdx].getIndex() + 1)); } out.println(bf); out.println("*******************************"); } } catch (Throwable th) { th.printStackTrace(); } finally { if (scanner != null) { scanner.close(); } if (out != null) { out.close(); } } } }
31
32
Grundlegende Algorithmen mit Java
Die Programmanalyse ǯȱ ȱ ȱ ¢ȱ ¡ȱ ȱ ȱ Ȭȱ ȱ £ȱ ȱȱȱȱǯȱȱȱȱ§ȱȱȱ ȱ £ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǻ £Ǽȱ DZȱ ȱ ȱȱȱȱ£ȱȱȱ ȱȱȱȱ ȱȱȱȬ ǯȱȱȱ ȱȱ¡ȱȱȱȱȱȱãȬ ǯȱȱ ȱ
ǯȱȱ ȱȱȱ ȱȱȱȱû ȱȱ§ȱ ȱȱ ȱȱ ǰȱȱȱǯȱ ȱ ȱȬ ȱûǰȱ ȱȱȱȱ ȱȱ ǰȱûȱȱȬ ȱ£ȱȱȱȱȱãȱûȱ ǯȱȱ ȱ ȱ ȱ ȱ ȱ£ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ ȱ £ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ
ǰȱȱȱ£ȱDZȱ ȱ public Box(int boxIndex, int boxDimensions[]) { this.index = boxIndex; this.dimensions = boxDimensions; } ȱ ȱ£ȱ ȱȱȱǻǼȬȱȱȱȱ¢ȱ¡DZȱ ȱ boxes[i] = new Box(i, boxDimensions); ȱ ȱûȱȱ ȱ ȱ ȱ¡ǰȱ£ȱȱȱȬ ȱȱȬ ȱȱǰȱȱ ȱȱȱȬ ȱ ȱȱȱǯȱ ȱȱ ȱȱ ȱȱ ȱ ǰȱ£ȱȱȱȱȬ ǯȱ ȱ ¢ǯȱ ȱ ȱ ¢ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ DZȱ Ǯȱ ȱ ȃǯȱ ¢ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ûǯȱ ȱ ȱ ȱ Ȭ ȱ ȱ Ȭȱ ǻûȱ ǰȱ ǯȱ Ǽȱ ȱ ȱ ȱ §ȱ ȱ ȱ ȱ Ȭȱ ȱ ȱ û¢ȱ ǻûȱ ǰȱ ǯȱ Ǽǯȱ ȱ ȱ ȱ Ȭ ȱ ȱȱûȱȱǯǯ¢ǯǻǼǰȱȱȱȱȬ ȱȱ¢ȱǽǾȱȱȱȱȱȱȱ¢ȱ¡ǽǾǯȱ ȱ
2 Verschachtelte Schachteln
33
ȱȱȱ ȱ¡ǯȱȱ ȱ¡ȱȱȱȱȱ ȱǻǯȱȱ ȱǼȱȱŖŗȏ¡¡ǯȱȱȱȱȱȱȱǰȱ ȱȱȱ ȱȱȱ£ȱ ȱȱȱȱȱȱ£ȱ ǯȱȱ ȱ¡ȱȱǰȱ ȱȱȱȱǰȱȱȱđȱ£ȱ£Ȭ ǯȱ ȱ ȱȱǯǯǯȱ ǰȱȱȱȱǰȱãȱȬ ȱȱ ȱȱȱȱ ȱ£ǰȱ£ȱȱȱ ǯȱȱ ȱȱȱû ȱȱȱȱȱȬ ȱ ǰȱȱȱ ȱ ȱ £ȱãǰȱȱȱȱ ȱ ȱǯȱȱ ȱȱȱ§ȱȱȱ£ȱȱȱ ȱ ȱ ǯȱ ȱ ȱ ûȱ ȱ ȱ DZȱ ǯǯǰȱ Ȭ ǯǯǰȱ ǯǯǰȱ ǯǯ£ǰȱ ǯǯǰȱ Ȭ ǯǯǰȱǯǯǰȱǯǯǰȱǯǯǯȱȱãǰȱȱ ȱ ȱ ȱ ȱ £ȱ ǰȱ ȱ ȱ ȱ ǻǽǾȱ Ǽȱ ȱȱ ȱ¢ȱǰȱȱȱȱȱǯȱDZȱȱ ȱ Arrays.sort(boxes); ȱ ûȱ ûȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ Ȭ DZȱ ȱ public int compareTo(Object o) ȱ ȱȱȱȱȱȱǻǼǰȱȱȱȱ£ȱȱ
ȱ ȱ Ǯûȱ ȃȱ ǰȱ ȱ ȱ ȱ ȱ £ǯȱ ǯȱ ȱ Ȭ ȱȱ ȱãǯȱǻǼȱȱ ȱǀȱŖǰȱ ȱȱȱȱȱȱ£ȱȱǰȱ ȱȱȱȱŖǰȱ ȱȱȱȱȱȱ£ȱȱȱȱȱ ȱǁȱŖǰȱ ȱȱȱȱȱȱ£ȱȱǰȱ £ûǯȱ ȱ ȱȱȱȱǰȱ ȱȱȱ¢ǯǻǽǾȱǼȱȱȱȬ ¢ȱȱǯȱ ȱ ȱ ȱǯǯ¢ȱȱǰȱȱ¢ȱȱȱ¢ȱ ȱȱǰȱǰȱǰȱǰȱǰȱûȱȱȱ ãđȱǯȱǯǯ¢ȱȱȱȱȱǻǼǰȱȱȱ¢ȱȱ ȱ§ǯȱȱ ȱȱȱ¡ǰȱ ȱȱ££Ȭ
34
Grundlegende Algorithmen mit Java
ȱ£ȱȱǯȱȱ ȱȱȱȱȱȱ¢ǯǻǼȱ ȱ¢ǯǻǼǯȱ ȱ ȱȱȱȱ ȱȱȱ¢ȬȬ ǯȱȱȱȱȱ DZȱȱ ȱ try { Anweisung; … } catch (Ausnahmetyp_1 x1) { Anweisung; … } catch (Ausnahmetyp_2 x2) { Anweisung; … } … catch (Ausnahmetyp_n xn) { Anweisung; … } [ finally { … } ] ȱ ȱ ǰȱȱȱȱ¢Ȭȱǰȱãȱȱȱûȱ£ȱȬ ȱȱȱ¢ȱ¢ȏȱûǯȱȱȱǰȱ ȱȱȱ ȱȱȱȱȱȱȱȱȬȱ ûǰȱȱ ȱȱȱȱȱ ¢ȱ§ǯȱȱȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻǼȱ ǰȱ ȱ ȱ £ȱ ȱ Ȭ £ȱ £ûǯȱ ȱ ¢Ȭ ȱ ȱ ȱ ¢ȬȬ ȱ ȱ ǯȱ ȱ ȱ ȱ ûȱ ǻȱ Ǽǰȱ ȱ ȱ ȱ ȱ ¢Ȭȱ ǰȱ ȱ ȱ ȱȱ Ȭȱȱȱȱǰȱ ȱȱȱ§ȱûǰȱ §ȱ £ȱ ǻ£ǯȱ ǯȱ ȱ £Ǽǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ǰȱ ȱ ȱ Ȭȱ ȱ ȱ £ȱ đǯȱȱ ȱ
2 Verschachtelte Schachteln
35
ȱ ȱ ǯȱ ȱ ãȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ǰȱ ȱ ȱ ȱ śȱ ûȱ ǯȱ ȱ ȱ ȱ Ȭ ȱ £ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ ǯȱ ȱ £ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ¢ȱ Ȭ ȱȱȱ£ȱȱǯȱȱ ȱȱȱȬ ǻǼȱȱǻǼǰȱȱȱ¢ȱ£DZȱǻǼȱûȱȱȱȱȬ ȱȱȱȱȱ£ǰȱǻǼȱûȱȱȱȱȱȱ ȱǯȱ ȱ ȱ ȱȱȱȱȱǯȱȱȱȱȱȱȱȬ ȱǯȱȱȱ ȱȱ ȱśȱûǯȱȱȱȱ£ȱȱȱ £ǯȱǯȱȱ§ȱ ȱǯǯǯȱȱ£ȱȱȱȱȱȱ ¡ǰȱȱȱ¢ȱȱȱȱǯȱȱûȱ Ȭ DZȱ • ȱ£ȱȱȬȱ ȱȱȬȬ ȱȱȬ ǰȱ ȱȱȱDZȱ ȱ scanner = new Scanner(new File("schachteln.in")); ȱ ǻȱȱȱ£ ǰȱȱȱȱȱ£ȱ ȱȱȱ¢ȬȬǼȱ • ȱȱȱȱȱ¡ǻǼȱǰȱȱȱDZȱ ȱ Box boxes[] = new Box[scanner.nextInt()]; int numDimensions = scanner.nextInt(); for (int i = 0; i < boxes.length; i++) { int boxDimensions[] = new int[numDimensions]; for (int j = 0; j < numDimensions; j++) { boxDimensions[j] = scanner.nextInt(); } … ȱ • ȱ¡£ȱȱȱȱȱ¢ȱȱȱȱȬ ¡ǻǼȱûǰȱȱȱDZȱ ȱ while (scanner.hasNextInt()) { … ȱ ȱ ȱȱȱȱȱǯȱȱȱãǰȱȱȱȬ ¢ȱȱȱ¡ȱȱ£ǰȱȱ£ ȱDZȱ • ȱ ǰȱ £ǯȱ ǯȱ ȱ ȱ ȱ ǰȱ ȱ Ȭ ȱ£ǰȱȱȱȱȱȱ ȱDZȱ
36
Grundlegende Algorithmen mit Java
out = new PrintWriter(new File("schachteln.out"));ȱ ȱ •
ȱ ȱ ȱ ¢ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǻǼȱ ûȱ ǰȱ ȱ ȱ ȱ ûȱ ȱ ǻ¢Ǽȱȱǻ¢Ǽǯȱȱȱȱ ȱ ȱȱDZȱ
ȱ out.print("Laenge: "); out.println(v[indexMax]); StringBuilder bf = new StringBuilder(); … out.println(bf); out.println("*******************************"); ȱ ȱȬ ȱȱȱȱ ȱŗǯŚǯȱȱȱȱ£ǰȱǰȱȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ǰȱ £ȱ ûûǯȱ §đȱ Ȭ ȱȱȱȱȱȱǻȱ ûȱȱ §Ȭ §Ǽǯȱȱȱȱȱȱûȱ£ȱǰȱȱȱȱȱȱ ȱŗǯŚȱȱ ȱȮȱŗǯŚȱǰȱȱ ȱŗǯśȱȮȱŗǯśȱȱȱ ȱŗǯŜȱȮȱŗǯŜǯȱȱȱȬ £ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ǯȱ ȱ Ȭ ȱ £ȱ ȱ ȱ ǰȱ ȱ ȱ û ȱ £ȱ ãȬ ǯȱȱȱȱȱȬ ȱDZȱ ȱ assert Ausdruck1 [ : Ausdruck2 ]; ȱ
ȱ ȱ£ȱ£ȱûǰȱȱŗǰȱȱȱ¢ȱȱȱǰȱ ȱ ǯȱȱǰȱûȱȱȱȱȬ ǰȱ ȱ ȱȱ ȱ ȱ ¢ȱ ǯǯȱ ǯȱ ȱ ȱ ȱ Ȭ Řȱ ȱ ¡ǰȱ ȱ ȱ ȱ ȱ ¡ǯȱ ȱ ȱ ȱ Řǰȱȱ ȱȱ ȱȱ ȱȱȱûȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¡ǯȱ ȱ ¢ȱ ȱ Řȱȱȱȱǰȱȱȱȱȱȱȱǰȱȱȱ £ûǯȱȱ ȱȱȱȱȱȬ ȱȱȱȬ ȱ ǻǼȱȱȱǻǼǰȱȱ£ȱ£ǰȱȱ£ ȱȱȱȬ ȱDZȱ ȱ assert this.dimensions.length == otherBox.dimensions.length : " Schachteldimensionen sind nicht einheitlich!"; ȱ
2 Verschachtelte Schachteln
37
Aufgaben ŗǯ
ȱ ȱ ¡ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ȱûȱȱǰȱȱȱȱȱȱȱǰȱȱȱ ȱȱȱȱȱȱǯȱȱȱȱȱȱȱȬ ǵȱ ǯȱ Řǯ ȱȱȱȱȱȱȱǻǼǯȱȱ řǯ ȱãȱǰȱȱȱȱȱȱȱǻȱǰȱ§ȱ ȱȱ£ȱđȱȱȱ ǯǼǯȱ ȱȱȱȱ ǰȱȱȱ ȱȱȱûȱ ǯȱ Śǯ ȱȱȱǰȱȱȱđȱȱûȱȱ ȱǰȱȱûȱȱȱȱǯȱȱȱȬ ȱȱǰȱȱȱȱȱ§£ȱȱđȱȱȱ §ȱȱȱȱȱȱǯȱ śǯ ȱãȱǰȱȱȱȱȱȱȱȱȬ ȱ ȱ ȱ ¡ȱ §ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱȱȱȱȱȱȱ ǯȱ Ŝǯ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ Ȭ ǰȱȱȱȱãǰȱȱȱ£ȱȱȱ ȱȱȱ£ȱǯȱ ŝǯ ȱ ȱ ǰȱ ȱ ȱ ȏȏȱ £ȱ ¢Ȭ ȱ ȱ ãǰȱ ȱ ȱ ȱ £ȱ ¢ǰȱ ȱ ȱȬȬǯȱ Şǯ ȱȱȱ ȱȱȱȱȱǯǯȱȱ ȱ ȬȬǰȱȱȱȱȱ ȱȱȱ ȱȱȱǻǼȱȱȱ ȱǻ ¢Ǽȱǯȱ şǯ ȱ ȱ ȱ ȬȬȱ ûȱ ȱ ȱ ǯǯǰȱ ǯǯǰȱ ǯǯǰȱ ǯǯ£ǰȱ ǯǯǰȱ ǯǯǰȱ ǯǯǰȱ ǯǯȱ ȱ ǯǯȱ ǯȱ ȱȱǰȱȱȱȱȱ£ǯȱ ŗŖǯ ȱ ȱ ȱ ȱ ȱ ¢ȬȬ DZȱ ȱ ȱ Ȭ ǰȱȱȬ ǰȱȱ¢Ȭ ȱȱǯȱȱȱ ȱ ȱ ȱ ȱ ¢Ȭȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭãȱ ǯȱ ȱ ȱ ȱ £ȱ ȱ ȱȱDZȱ¡ǰȱ¡Ȭ ¡ǰȱ ¡ǰȱ ¢¡ǰȱ Ȭ ¡ǰȱ ¡ǰȱ ¢£¡ǰȱ Ȭ ¡ȱǻȱȱȱȱǯǼȱ ŗŗǯ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ûȱ ¢Ȭ ȱȱȱȱȱȱǯȱ DZȱȱ Ȭ
38
Grundlegende Algorithmen mit Java ǰȱ ûȱ ǻǻǼǰȱ ǻǼǼǰȱ ãȱ ǻǻǼǰȱ ǻǼǼȱ ȱȱ §ȱ ȱ ȱ ǻǻǼǰȱ ǻǼǼǰȱ ȱ ȱ §ȱ ǻǻǼǰȱ¢ǻǼǼǰȱ ȱȱȱǯǯȱǻǻǼǼǯȱ£ȱ ȱȱȱȱȱȱȱȱǯȱ
Anmerkungen ȱȱȱ ȱȱȱ ȱȱȱDZȱ ŗǯ ȱȱ¢ȱǯȱ Řǯ ȱ £ȱ ȱǰȱ¢ǯȱ řǯ ȱ £ȱȱȱȱ ǯȱ Śǯ ȱȱǯǯǯȱ śǯ ȱ ȱǯǯǯȱ Ŝǯ ȱȱȱȱ ȱȱ¢ȬȬȱȱȬ ǯȱ ŝǯ ȱȱȱ¢ȱȱȱȱȱȱȱȱȬ ȱǯǯȱ Şǯ ȱȱȱ¢ȱȱȱȱȱǯǯǯȱ ȱ
ȱ ¢ȱȱǰȱȱ
ȱ
3
Greedy ȱ ȱ ȱ ȱ ȱ
Grundlagenȱ ¢Ȭȱ ǻǯȱ ¢ȱ ƽȱ Ǽȱ ȱ ȱ £ǰȱ ȱ ȱ Ȭ ȱȱȱȱȱ §ǯȱȱûȱȱȱȱ£ȱȬ ûȱȱȱ ǰȱȱ£ȱ ȱȱȱ Ȭ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ãǯȱ ȱ đȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ãȱ ǯȱ ȱ ȱ ȱȱǰȱ ȱȱȱȱȱûȱȱȱȬ ǰȱ §ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǯȱȱ ¢Ȭȱȱûȱȱȱȱãǰȱȱȱȱ ãȱ ȱ ȱ ȱ ǰȱ ȱ ȱ Ȭȱ ǰȱ ȱȱȱȱ ȱ§ǯȱȱȱȱȱȬ§ǰȱ ȱ ȱ ȱ ¢Ȭȱ ȱ ȱ ȱ ȱ Ȭȱ ȱ ȱ ãȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ûȱ £ȱ ȱ §ǰȱȱȱ§ȱȱȱȱ££ȱȱȱȬ ǯȱȱ
ȱȱȱȱȱGreedyȬDZȱ
ȱ ȱ
ȏ ¢ǻȱǼȱ ŗȱȱȱȱȱ←ȱȱ ȱ←ȱ∅ȱ ȱȱǻȱȬǼȱȱ ȱȱȱ¡ȱ←ȱȱȱ¢ȱȱȱȱŗȱ ȱȱȱŗȱȱ←ȱŗȱȱǿ¡Ȁȱ ȱȱȱȱǻȱ∪ȱǿ¡Ȁȱ¢ȱǼȱȱ ȱȱȱȱȱȱȱȱȱ←ȱȱȱȱ∪ȱȱǿ¡Ȁȱ ȱȱȱȏȱ ȏȱ ȏ ȏ ¢ǻȱǼ
40
Grundlegende Algorithmen mit Java
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ DZȱ ȱ ȱ û£ȱ ȱ ȱ ȱ ǻDijkstraǼǰȱ ȱ ȱ ȱ ȱ ǻPrim, KruskalǼǰȱȱȱǰȱ Ȭ ǯȱ
Problem 1. Rucksackproblem ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǯȱȱȱȱȱȱȱ £§ȱȱȱȱ ȱȱȱȱ£ ǯȱ ǯȱȱȱ ȱãǰȱȱȱȱȱȱ£ȱûǰȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ǰȱ ȱ ȱ Ȭ ȱ ȱ ȱ ȱ ãȱ ǻȱ ǮȬ ȃǼȱȱȱȱȱȱȱȱǯȱDZȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £§ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǻ ǰȱǼȱûȱȱǰȱȱȱȱǯȱDZȱȱȱȱȱȬ ȱǯȱȱ£ ǯȱȱȱûȱȱǰȱ ȱȱDZȱ ȱ rucksack.in rucksack.out 41 Objekt 2: 23.45 600.54 - vollstaendig 12.34 123.99 Objekt 1: 12.34 123.99 - vollstaendig 23.45 600.54 Objekt 3: 12.78 90.67 - 5.21kg 12.78 90.67 9.34 45.32 ȱ
Problemanalyse und Entwurf der Lösung ȱ ȱ ȱ ȱ ȱ ȱ §ȱ Ȧ ȱ ȱ ȱ Ȭ ȱȱȱȱȱȱȱǯȱȱ£ȱȱ ȱȱ ȱ ȱȱȱȱ ǯȱȱȱȱ ȱǰȱȱ ȱ ȱ ûȱ ȱ ȱ DZȱ ȱ ǻ Ǽǰȱ ȱ ǻǼȱ ȱ Ȭ ¡ȱ ǻ¡Ǽȱ ȱ ȱ ȱ ȱ ûȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ §ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻǼȱ ȱ ǻǼǯȱ ȱ ãǰȱ ȱ ȱ ȱ Ȭ ȱ ȱ£ȱǰȱȱȱȱǻǼȱȱȱ ȱȱǰȱ ȱȱȱȱǯȱDZȱȱ ȱ Collections.sort(v); ȱ ûȱ ûȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ Ȭ DZȱ public int compareTo(Object o)
3
Greedy
41
ȱ ȱȱȱȱȱȱǻǼǰȱȱȱȱ£ȱȱ
ȱ ȱ Ǯûȱ ȃȱ ǰȱ ȱ ȱ ȱ ȱ £ǯȱ ǯȱ ȱ Ȭ ȱȱ ȱãǯȱǻǼȱȱ ȱǀȱŖǰȱ ȱȱȱȱȱȱ£ȱȱǰȱ ȱȱȱȱŖǰȱ ȱȱȱȱȱȱ£ȱȱȱȱȱ ȱǁȱŖǰȱ ȱȱȱȱȱȱ£ȱȱǰȱ £ûǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ §ȱ Ȧ ǯȱ ȱ ûȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱȱ£ȱȱǯȱȱȱ£ȱȱȱȱǰȱȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ãǰȱ ȱ ȱ £ȱ ȱ ȱȱ ǻȱ≤ȱŖȱǰȱȱȱȱȱǼǯȱȱ ¡§ȱȱȬ ȱȱǻȱȱǼǰȱ ȱȱȱȱȱǻǼȱ§ȱǯȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ȱDZȱ ȱ out.print(v.get(i));ȱ ȱ
ȱ ȱȱȱǻǼȱȱȱ ȱȱȱȬ ǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P01Rucksack { private static final String FileInputName = "rucksack.in"; private static final String FileOutputName = "rucksack.out"; public static void main(String[] args) throws IOException { Scanner scanner = null; PrintStream out = null; try { scanner = new Scanner( new File(FileInputName)).useLocale(Locale.ENGLISH); out = new PrintStream(new File(FileOutputName)); float M = scanner.nextFloat(); List v = new ArrayList(); int index = 0;
42
Grundlegende Algorithmen mit Java while (scanner.hasNextFloat()) { float weight = scanner.nextFloat(); if (!scanner.hasNextFloat()) break; float value = scanner.nextFloat(); v.add(new RucksackObject(++index, weight, value)); } Collections.sort(v); int i = v.size() - 1; while (i >= 0 && M > 0) { float wgt = v.get(i).getWeight(); if (M >= wgt) { M -= wgt; --i; } else { M = -M; } } for (int j = v.size() - 1; j > i; --j) { out.print(v.get(j)); out.println(" - vollstaendig"); } if (i >= 0 && M < 0) { out.print(v.get(i)); out.print(" - "); out.print(-M); out.print(" kg"); } } finally { if (scanner != null) { scanner.close(); } if (out != null) { out.close(); } } }
} class RucksackObject implements Comparable { private int index; private float weight, value; RucksackObject(int index, float weight, float value) { this.index = index; this.weight = weight; this.value = value;
3
Greedy
43
} public int compareTo(RucksackObject other) { float diff = this.value / this.weight – other.value / other.weight; return diff > 0f ? 1 : (diff < 0f ? -1 : 0); } public String toString() { return "Objekt " + this.index + ": " + this.weight + " " + this.value; } public float getWeight() { return weight; } }
Aufgaben ŗǯ
ȱ ȱ ãǰȱ ȱ ȱ ȱ ȱ £ȱ ǰȱ ȱ ȱ ȱȱȱȱȱǯȱǰȱȱȱȱȱȱ
ȱ public int compare(Object o1, Object o2) ȱ Řǯ
ǯȱȱȱȱȱȱǯȱȱ ȱ ȱ ȱ ãȱ ȱ ȱ §ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ¢Ȭȱ ȱȱȱȱãǯȱȱȱȱȱûǯȱȱ
Problem 2. Kartenfärbung ȱȱȱ£ȱȱǻŘȱ≤ȱȱ≤ȱŘŖǼȱȱ§ȱȱȱ£ãȱȱȱ ¡ȱǽǾǽǾȱǰȱȱȱǽǾǽǾȱƽȱŗȱǰȱ ȱȱ§ȱȱȱȱȱǰȱȬ ȱ ȱ ǽǾǽǾȱ ƽȱ Ŗǯȱ ȱ ȱ ȱ ãǰȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ £§ǰȱ ȱ £ ȱ §ǰȱ ȱ ȱ £ǰȱ ȱȱȱûǯȱȱȱȱȱȱȱȱ £ ȱȱûȱȱŗȱȱȱȱǯȱDZȱ ȱ map.in colors.out 7 1 2 3 4 1 2 5 0 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1
44 1 0 0 1 ȱ
Grundlegende Algorithmen mit Java 1 0 0 0
1 1 0 1
0 1 0 1
1 0 1 1
0 1 0 1
1 1 1 0
Problemanalyse und Entwurf der Lösung ȱ ȱ ãȱ ȱ ȱ ȱ ȱ ȱ Ȭǰȱ ȱ ȱ ȱ ȱ ¡ȱ ¡§ǯȱ ȱ ¢Ȭȱ ȱ £ ȱ ȱ £ȱ£ȱȱǰȱȱȱȱȱȱ£ǯȱȱ§ȱȱ ȱ ȱ ȱ Ŗȱ ȱ ȱ £ȱ ȱ §ȱ ȱ ȱ ȱ ûȱ ȱ ǻȱȱȱȱ§ȱǼȱǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P02MapColoring { private static final String FileInputName = "map.in"; private static final String FileOutputName = "colors.out"; public static void main(String[] args) throws IOException { Scanner scanner = null; PrintStream out = null; try { scanner = new Scanner(new File(FileInputName)); int n = scanner.nextInt(); int a[][] = new int[n][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = scanner.nextInt(); } } int col[] = new int[n]; col[0] = 0; for (int i = 1; i < n; i++) { int j = -1; boolean ok = do { j++; ok = true; for (int k ok && if (1 ==
false;
- col[0] ← 0 - ȱ ȱȱȱȱûȱȱ ûȱ ȱ ȱ ȱ ǻ ȱ ȱ ȱ ǮȄȱ ȱ ȱȱ¡ȱȱȱȱǰȱȱ 1==a[k][i] && col[k]==jȱ ǰȱ ȱ §ȱ ok ȱ false)ȱ
= 0; k < i; k++) a[k][i] && col[k] == j)
3
Greedy
45
ok = false; } while (!ok); col[i] = j; } out = new PrintStream(new File(FileOutputName)); for (int i = 0; i < n; i++) { out.print(col[i] + 1); out.print(" "); } } finally { if (scanner != null) scanner.close(); if (out != null) out.close(); } } } ȱ
Aufgabe ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ £ãȱȱȱȱ ǰȱ ȱ ȱ ȱ ȱ §ȱ ȱ Śȱ ǯȱ ȱ ȱ ȱ ȱ ȱȱ§ȱǰȱȱ£ ȱ§ȱȱȱȱȱ ǯȱ
Problem 3. Springer auf dem Schachbrett ȱ ȱ ȱ ǰȱ ȱ ûȱ ȱ ȱ ȱ ȱ )ȬȱǻŚȱ≤ȱǰȱȱ≤ȱŗŖŖǼȱȱȱǰȱȱȱȱȱ ȱȱȱǯȱDZȱȱȱȱǯȱȱ ȱȱȱȱȱȱ ãđȱǰȱȱȱȱȱ£ ȱ ȱ ȱ ȱ ǻ ǰȱ Ǽȱ ȱ ǯȱ DZȱ ȱȱȱȱȱǯȱȱȱǰȱ ȱ ȱ ȱ ȱ ¡ȱ ȱ ǰȱ ȱ ȱ ȱ ŗȱ ȱ ȱ ȱ ȱûȱȱŗȱ£§ȱ ǯȱȱȱãȱȱ ǰȱȱȱ ȱǮ ȱǷȃȱǯȱDZȱ ȱ springer.in springer.out 5 5 19 12 7 2 21 2 2 6 1 20 17 8 11 18 13 22 3 14 5 24 9 16 25 10 15 4 23 5 5 Keine Loesung! 2 3
46
Grundlegende Algorithmen mit Java
Problemanalyse und Entwurf der Lösung ȱ ȱ ȱ Ȭȱ ǰȱ ȱ ȱ ȱ £ǯȱ ǯǯȱ ȱȱŗŞŘřȱȱȱǰȱȱȱȱȱȱãȱȱȱ £ȱȱãȱûǯȱȱȱ ȱȱȱ £ȱȱ ȱ ȱ ãȬ ȱȱǰȱȱȱûȱȱǰȱ ȱȱȱûȱ ¡ǯȱȱȱȱȱ ǰȱȱȱ §ȱȱ£ ǯȱȱ ǰȱȱȱȱ£ȱȱȱãȱ ǯȱȱ§Ȭ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ãȱ ûȱȱȱȱDZȱȱ ȱȱȱȱȱ§ȱȱǰȱȱ ȱȱǰȱ£ûȱȱ£ȱ ǰȱ ȱȱȱȱȱȱ Ȭ ȱȱȱȱȱȱȱ ȱãǯȱ ȱȱ ȱȱ ȱȱȱ¡ȱǽǾǽǾȱǯȱȱȱȱȬ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ¢ȱ ¡ǽǾȱ ȱ ¢ǽǾȱ ȱǻȱǼǯȱȱ ȱȱȱȱǻ¡ǰȱ¢ǼȱǰȱȱȱȱȬ ȱȱãȱ¡Ƹ¡ǽǾǰȱ¢Ƹ¢ǽǾȱȱƽŖǰǯǯǯǰŝǯȱȱȱ ǻǼȱȱ ȱ £ȱ ȱ ȱ £ûǰȱ ȱ ȱ ȱ ȱ ȱ ǻ¡ǰȱ ¢Ǽȱ ȱ £ȱ ȱ ǻȱ ȱ ȱ ȱ ȱ ûǼǯȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻǼDZȱ ȱ ãȱ ȱ ȱ ûȱ ȱȱ£ ǯȱȱȱȱȱȱ£ȱȱ ȱûȱ ȱ£ûȬ ǯȱȱȱȱǰȱ ȱȱȱȱȱȱȱȬ ǰȱȱȱȱȱǯȱȱȱȱȱǰȱȱȱȱȱȬ ȱǻȱȱ£ȱȱ ȱûǼȱȱȱ ȱ¡ȱȱ¢ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭȱ ȱ ȱ ȱ ȱǰȱȱ ȱȱȱǻǼȱǯȱȱȱȱ £§ȱȱûȱȱǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P03Knight private static final private static final private static final private static final
{ String FileInputName = "springer.in"; String FileOutputName = "springer.out"; int dx[] = { -2, -2, -1, -1, 1, 1, 2, 2 }; int dy[] = { -1, 1, -2, 2, -2, 2, -1, 1 };
private static boolean onTheTable(int x, int y, int m, int n) { return (0 2.0 0 4 3 10 0 0 0 0 18 0 (6, 8) -> 2.0 4 0 1 0 5 0 0 0 0 0 (1, 3) -> 3.0 3 1 0 9 5 0 0 0 0 0 (8, 10) -> 3.0 10 0 9 0 7 8 0 9 8 0 (2, 5) -> 5.0 0 4 5 7 0 9 9 0 0 0 (4, 5) -> 7.0 0 0 0 8 9 0 2 2 0 0 (4, 6) -> 8.0 0 0 0 0 9 2 0 4 0 6 (4, 9) -> 8.0 0 0 0 9 0 2 4 0 9 3 -------------------18 0 0 8 0 0 0 9 0 9 Gewicht: 39.0 0 0 0 0 0 0 6 3 9 0
3
Greedy
51
Problemanalyse und Entwurf der Lösung ȱ ȱ ȱ £ȱ ȱ ȱ ȱ §ȱ ȱ ȱȱ ȱȱǯȱȱȱȱȱȱȱȱǰȱȱȱ ȱ ȱ ȱ ȱ ȱ ǻǯȱ ŘşǯŖŗǯŗşŘŞǰȱ ȱ Ǽȱ ȱ ȱŗşśŜȱȱȱȱȱȱȱ¢ȱȱ ǯȱ ȱ ȱ ȱ ǻŗşśŜǼǯȱ ȱ ȱ ȱ ȱ ƽǻǰȱ Ǽȱ ȱ ȱ ȱ ȱ ȱ ȱ DZȱ ȱ Řȱ [ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ƽǻǰȱ xǼǰȱ ȱȱ ȱǯȱ ȱȱȱȱȱȱȱȱȱȬŗȱ ȱȬ ǯȱȱûȱ ȱȱ ȱȱȱȱ ȱ ȱ£ǯȱȱȬ ȱ ȱȱȱȱȬŗȱ ǯȱ£ȱ §ȱ ȱȱȱ ȱ ȱȱȱ ȱȱȱǰȱȱȱ¢ȱȱȱȱȬ §ȱ ȱ£ǯȱȱđǰȱ ȱȱȱûȱȱ ȱȱȬ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ûȱ ȱ ȱ ȱ £ǯȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ ŗǯȱ ȱȱǰȱ ȱȱȬŗȱ ȱ §ȱǯȱȱ ȱȱȬ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱǯȱ ȱ ȏ ǻ ȱ Ǽȱ ȱ ȱȱȱǻŗǰȱŘǰȱdzǰȱǼȱ ȱ ȱȱȱȱǻƜŗǰȱDzȱȱŗǼȱ¡ȱȱ ȱ ȱȱȱȱȱȱ ǽǾȱƜȱȱȱȱȱȱȱȱȱ ȱ ȱ ȱȱȱ ȱȱȱȱȱȱȦȦȱȱ ȱ£ȱ ȱ ȱȱȱȏȱ ȱ ȱȱȱ ȱƜȱŖȱ ȱ ȱȱȱȱƜȱŖȱ ȱ ȱȱȱȱǻǀȬŗǼȱȱ ȱ ȱȱȱȱȱȱȱȱǻǰȱǼȱƜȱ¡ǻǼȱ ȱ ȱȱȱȱȱȱȱȱȱǻ ǽǾȱƽȱ ǽǾǼȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱǻǰȱǼȱƜȱ¡ǻǼȱ ȱ ȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱȱȱȱȱȱ ǯǻǻǰȱǼǼȱ ȱ ȱȱȱȱȱȱȱȱ ȱƜȱ ƸǻǰȱǼȱ ȱ ȱȱȱȱȱȱȱȱȱȱƜȱƸŗȱ ȱ ȱȱȱȱȱȱȱȱ¡ȱƜȱ¡ǻ ǽǾǰȱ ǽǾǼȱ ȱ ȱȱȱȱȱȱȱȱȱȱƜȱǻ ǽǾǰȱ ǽǾǼȱȱȱȱȱȱȱȱȱȱȱ ȱ ȱȱȱȱȱȱȱȱȱǻƜŗǰȱDzȱȱŗǼȱ¡ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȦȦȱ£ ȱ ȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱǻȱ ǽǾƽ¡Ǽȱȱ ǽǾƜȱȱȏȱ ȱ ȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱȏȱ ȱ ȱȱȱȱ ǰȱ ȱ ȏ ȏ ǻ ȱ Ǽȱ
52
Grundlegende Algorithmen mit Java
ȱȱ ȱȱȱȱ £ȱǰȱȱ ȱȱȬ ǰȱȱȱȱ ȱȱȱȱ ȱȱǯȱȱ ȱ ȱ ȱȱȱǯǰȱȱȱȱȱȱûȱȬ ȱǯȱȱ ȱȱȱûȱǰȱȱ ȱȱ ȱ ȱ ȱȱãǰȱ ȱ ȱȱûȱȱȱ£ǯȱȱ ȱ TreeMap E = new TreeMap(); ȱȱȱ£ȱȱ ȱȱ ȱǰȱ§ȱȘƸȱȱ ȱǻǰȱǼȱǻȱ ȱȱȱȱȱȱ ȱȱ ȱȱ£ȱDZȱȱȱѥȱȱǰȱѥȱ ȱǼǯȱȱȱ ¡ȱ¢ȱ£ȱ ȱǰȱȱ ȱ ȱȱȱûȱȱ DZȱ ȱ for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { double aux = scanner.nextDouble(); if (i < j && aux != 0D) { putInMultimap(E, aux, i * n + j); ȦȦȱȱǻ¡ǰȱȘƸǼȱûȱ } } } ȱȱȱȱǻûǰȱǼȱ££ûǰȱȱ ȱȱȬ ȱǻǼDZȱȱȱûȱȱȱûȱȱȱȱǻvalues == nullǼǰȱȱ ȱȱȱǻ¢ǰȱǼǰȱ ȱȱȱȱȱǰȱȱ ûȱȱȱȱȱȱ£ǯȱȱȱûȱȱȱûȱȬ ȱȱǰȱȱ ȱȱȱȱȱǯȱ ȱ private static void putInMultimap(TreeMap mmap, Double key, Integer value) { List values = mmap.get(key); if (values == null) { values = new ArrayList(); mmap.put(key, values); } values.add(value); } ȱȱȱ£ȱǰȱ ȱ ȱȱ ȱȱȱ ȱȱ¢ǻǼǰȱǻǼǰȱ¡ǻǼȱȱǻǼǯȱȱȱȱȱȱ ǯǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǯǯȱ ǰȱ ȱ ȱ ȱ tȬ ǯȱ
3
Greedy
53
Programm import java.io.*; import java.util.*; public class P04SpanningTree { private static final String FileInputName = "kruskal.in"; private static final String FileOutputName = "kruskal.out"; public static void main(String[] args) throws IOException { Scanner scanner = null; PrintStream out = null; try { scanner = new Scanner( new File(FileInputName)).useLocale(Locale.ENGLISH); out = new PrintStream(new File(FileOutputName)); int n = scanner.nextInt(); TreeMap E = new TreeMap(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { double aux = scanner.nextDouble(); if (i < j && aux != 0D) { putInMultimap(E, aux, i * n + j); } } } int C[] = new int[n]; for (int i = 0; i < n; i++) C[i] = i; TreeMap H = new TreeMap(); int szH = 0; while (szH < n - 1) { TreeMultimapIterator it = new TreeMultimapIterator(E); it.next(); int uu = it.value().intValue() / n; int vv = it.value().intValue() % n; while (C[uu] == C[vv]) { it.next(); uu = it.value().intValue() / n; vv = it.value().intValue() % n; } putInMultimap(H, it.key(), it.value()); szH++; it.remove(); int mi = Math.min(C[uu], C[vv]);
54
Grundlegende Algorithmen mit Java int ma = Math.max(C[uu], C[vv]); for (short i = 0; i < n; i++) if (C[i] == ma) C[i] = mi; } double cost = 0; Set<Map.Entry> hEntries = H.entrySet(); for (Map.Entry entry : hEntries) { List values = entry.getValue(); double key = entry.getKey(); for (int value : values) { ǮȬȃȱ out.printf("(%d, %d) -> ", value / n + 1, value % n + 1); out.println(key); cost += key; } } out.println("--------------------"); out.println("Gewicht: " + cost); } finally { if (scanner != null) { scanner.close(); } if (out != null) { out.close(); } } } private static void putInMultimap(TreeMap mmap, Double key, Integer value) { List values = mmap.get(key); if (values == null) { values = new ArrayList(); mmap.put(key, values); } values.add(value); } private static class TreeMultimapIterator { private Iterator<Map.Entry> mmapIt; private ListIterator currValuesIt; private Integer currValue;
3
Greedy
55
Map.Entry currEntry; TreeMultimapIterator(TreeMap mmap) { this.mmapIt = mmap.entrySet().iterator(); } boolean next() { if (this.currValuesIt != null && this.currValuesIt.hasNext()) { this.currValue = this.currValuesIt.next(); return true; } else if (mmapIt.hasNext()) { this.currEntry = this.mmapIt.next(); this.currValuesIt = this.currEntry.getValue().listIterator(); this.currValue = this.currValuesIt.next(); return true; } else { return false; } } Double key() { return this.currEntry.getKey(); } Integer value() { return this.currValue; } void remove() { this.currValuesIt.remove(); if (this.currEntry.getValue().isEmpty()) { this.currValuesIt = null; this.mmapIt.remove(); } } } } ȱ
Aufgaben ŗǯ Řǯ
ȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǯȱ ȱȱȱǰȱȱȱȱȱǯȱ
56
Grundlegende Algorithmen mit Java
Problem 5. Huffman-Kodierung ȱ ȱ ȱ ŘŜŘȱ ȱ ȱ ¡ȱ ȱ ȱȱǯȱȱ¡ȱȱȱȱ ȱȱǰȱǰȱǰȱ¡ǰȱ¢ǰȱȱ£ǰȱ ȱȱŗŖŖȱ ǰȱȱŗŝȱǰȱȱ£ ǰȱ¡ȱśŞȱǰȱ¢ȱŞŖȱȱȱ£ȱûȱ ǯȱȱ ȱ tȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ Ŗȱ ȱ ŗȱ £ȱ §ǯȱ ȱ ȱ ûȱ ȱ ȱ ¡ȱ ȱ ȱ ȱ §ǰȱ ȱ ȱ ȱ ȱ ȱ £ȱ £ ǯȱ ȱ ȱ ȱ ȱȱȱ§ȱ §ȱ ûǰȱ §ȱȱȱȱûȱȱȱȱ ȱãǯȱDZȱƽŖŖŖǰȱƽŖŖŗǰȱƽŖŗŖǰȱ¡ƽŖŗŗǰȱ¢ƽŗŖŖǰȱ£ƽŗŖŗǯȱȱȱ ȱ¡ȱŘŜŘȱȉȱřȱƽȱŝŞŜȱȱ£ǯȱ ȱ ȱȱȱȱȱȱȱ§ǰȱȱȱȱȱ£ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ãȱ £ȱ ȱ §ȱ ȱȱ ǯȱȱûȱȱ¡DZȱƽŖǰȱƽŗŗŖŗǰȱƽŗŗŖŖŖǰȱ¡ƽŗŗŗǰȱ¢ƽŗŖǰȱ £ƽŗŗŖŖŗǯȱȱ £ȱȱȱȱûDZȱŗŖŖȉŗȱƸȱȱŗŝȉŚȱƸȱŘȉśȱȱƸȱȱśŞȉřȱƸȱŞŖȉŘȱƸȱśȉśȱƽȱ śřŝǯȱȱȱŜŞǰřȱ£ȱȱŝŞŜǰȱȱȱȱ ȱûȱȱȱȱ ȱ§ȱřŗǰŝȱ£ȱ£ȱǯȱ ȱ ȱȱȱȱȱ§ȱûȱȱ¡ȱȱŘŜŘȱȱ ȱȱǰȱǰȱǰȱ¡ǰȱ¢ǰȱ£ȱȱȱ §ȱ ȱ
ȱ ȱ ȱ ȱ ¡ȱ ¢ȱ £ȱ ȱȱ
§ȱ ŗŖŖȱ ŗŝȱ Řȱ śŞȱ ŞŖȱ śȱ Ȭȱ ŝŞŜȱ ȱ§ȱ ŖŖŖȱ ŖŖŗȱ ŖŗŖȱ Ŗŗŗȱ ŗŖŖȱ ŗŖŗȱ śřŝȱ ȱ§ȱ Ŗȱ ŗŗŖŗȱ ŗŗŖŖŖȱ ŗŗŗȱ ŗŖȱ ŗŗŖŖŗȱ ȱ ȱ ȱ ȱ ȱ §ȱ ȱ ȱ ȱ ȱ ûǰȱ ȱ ȱ §ȱ
ȱ ȱ ȱ §¡ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ §¡ǰȱ ȱ ȱ ȱ ȱ ȱ ǻ Ǽȱ ȱ ȱ ȱ ǯȱ ȱ § ȱ ŗŖŗŗŖŖŖŗŗŖŖŗŖŗŗŗȱ ȱ ȱ ȱ£ȱ¢£¡ȱǯȱ ȱ ȱȱ ȱǻŗşŘśȬŗşşşǼȱȱŗşśŘȱǻȱ ȱȱȱǯǯǯǰȱǯȱŗŖşŞȬŗŗŖŘǼȱ ȱ§¡ȱǯȱ ȱ ȱȱ§ǰȱȱ§ȱȱ ȱȱ¢ǯȱȱ ȱûȱȱȱȱǰȱȱ ȱȱȱȱȱ£ȱȱ£ȱȱ§ȱȱȱŖȱǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ŗǰȱ ȱ ȱ ȱ ȱ ǯȱ Ȭ
3
Greedy
57
§ȱȱ§ȱǻȱ ȱȱȱȱ£ ȱ§Ǽȱȱ ȱȱ §ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ûȱ ȱ ȱ ǰȱȱȱȱȱ§ǯȱ ȱ ȱ ȱȱȱȱ£ǰȱȱȱȱȩȩȱ§ȱǻȱûȱȱ Ǽȱ ȱ ȩȩȬŗȱ ǯȱ ȱ ǻǼȱ ȱ §ȱ ȱ ȱ ȱ ȱ ȱ ǻǼȱ ȱ ȱ ȱ ȱ ǻȱ £ȱ ȱ ȱ ȱ Ǽǰȱ ȱ ȱ ȱûȱȱ¡ȱ
¦ f (c) ⋅ h(c) ȱȱȱȱȱ£ȱȱȱȱ ȱ
c∈C
ȱǯȱȱ ȱ ȱȱ ȱȱȱȱȱ ¢ȱDZȱȱ§ȱ ȱ ȱ ȱ ȱ ȩȩȱ ȱ ȱ ȱ ûȱ ȱ ȩȩȬŗȱ £ȱ ȱ ȱ đȱ ȱ §ȱ £ȱ ǯȱ ȱ ȱȱȱȱ£ ȱ§ȱ ŗȱ ȱŘȱȱ ȱ ȱǰȱȱ£ȱ ȱȱȱ£ȱ ǰȱȱŗȱȱŘȱȱ§ȱȱȱȬ ȱ ȱȱȱȱ ȱȱŗȱȱŘȱǯȱȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ Ȭ ȱ ǰȱ ȱ ȱ Ȭ ȱ ȱ ¡ȱ ȱ ȱ §ȱ ȱ ȱ ǯȱ DZȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻǰȱ §Ǽǯȱ ȱ ȱ ȱ ȱȱȱǰȱȱ §ȱȱûȱȱ£ ȱ ŗȱ ȱ ŗŖŖŖǯȱ DZȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǯǰȱ ȱȱDZȱ ȱ huffman.in huffman.out p 100 p 0 q 17 y 10 r 2 r 11000 x 58 z 11001 y 80 q 1101 z 5 x 111
Problemanalyse und Entwurf der Lösung ȱ £ǰȱ ȱ ȱ Ȭȱ ȱ ǯȱ ȱ ȱ ȱ ȱȱDZȱ ȱ ȱ ȱ
r:2
z:5
q:17
x:58
y:80
p:100
58
Grundlegende Algorithmen mit Java
ȱȱȱȱ§ȱȱȱ ȱȱȱ£DZȱ 7 ȱ q:17 y:80 p:100 x:58 ȱ ȱ r:2 z:5 ȱ ȱ £ȱ£ȱ ȱȱ§ȱȱȱ ȱŝȱȱŗŝDZȱ ȱ ȱ 24 y:80 p:100 x:58 ȱ ȱ 7 q:17 ȱ
ȱ ȱ r:2 z:5 ȱ ȱȱ§ȱȱȱ ȱŘŚȱȱśŞDZȱ ȱ 82 y:80 ȱ p:100 ȱ ȱ 24 x:58 ȱ ȱ 7 ȱ q:17 ȱ ȱ r:2 z:5 ȱ ȱ ȱ§ȱȱȱ ȱŗŖŖȱȱŗŜŘDZȱ ȱ 162 p:100 ȱ ȱ 82 y:80 ȱ ȱ ȱ 24 x:58 ȱ ȱ 7 ȱ q:17 ȱ ȱ r:2 z:5
3
Greedy
59
ȱȱȱ£ȱ£ȱȱȱȱǰȱȱȱ ȱȱȱ Ȭ ȱȱŖȱȱŗȱǯȱ ȱ 262 ȱ 1 0 ȱ ȱ 162 p:100 0 1 ȱ ȱ 82 y:80 ȱ 0 1 ȱ ȱ 24 x:58 0 1 ȱ ȱ 7 q:17 ȱ 0 1 ȱ ȱ r:2 z:5 ȱ ȱȱ§ȱ§ȱãȱ ȱȱ Ȭ ȱȱȬ ȱǰȱ ȱ ȱȱȱȱȱ£ȱȱ£ȱ ȱȱ ǯȱ ȱȱȱDZȱ ȱ ȱ ȏ ǻǼȱ ȱ ȱȱȱȱѥû§ǻǼȱ ȱ ȱȱȱȱǻȱȱȱȱȱǼȱȱ ȱ ȱȱȱȱȱȱȱŗǰȱŘȱѥ§ǻǼǰȱȱ ȱ ȱȱȱȱȱȱȱǯȱǻŗǰȱŘǼȱ ȱ ȱȱȱȱȱȱȱȱѥ£ǻŗǰȱŘǼȱ ȱ ȱȱȱȱȱȱȱǯǻǼȱ ȱ ȱȱȱȱȏȱ ȱ ȱȱȱȱȱ ǻǼȱ ȱ ȏȱ ȏ ǻǼȱ ȱ ȱ ȱ ¡§ȱȱȱȱǻȱȱǼȱȱȱȱȱȱ ȱ§ǯȱȱ Ȭȱûȱ£ȱȱȱ ǰȱȱ ȱȱȱȱȱȱ ǯȱ ȱûȱȱȱ£ǯȱ ǯȱȱǽŖŚǾȱȱǽ şŝǾǯȱ ȱ
60
Grundlegende Algorithmen mit Java
ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ §ȱ ȱ ûȱ ȱ §ǰȱ ȱ £ ȱ ȱ ǰȱ £ȱ £ȱ ȱ ȱ §ǰȱ ǰȱ ȱȱȱȱȱȱǰȱȱȱǯȱȱ ȱȱ §ȱȱȱȱȱȱȱ¢ȱȱǰȱ ȱȱûȱȱ ȱǯȱȱȱ ȱ£ ȱ§ȱȱȱȱãǰȱȱ ȱȱȱȱ§ǯȱȱûȱȱȱȱȱ ȱ ȱ ȱ ȱ ǻǼȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ ȱ §ȱȱǯȱȱȱȱ ȱȱȱǰȱȱ ȱȱȱȱ §ȱȱȱ ȱ£ȱȱȱȱȱǻ ȱȱ ǻȱǰȱȱǼǼǰȱȱȱȱȱȱȱãǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P05HuffmanCode { private static final String FileInputName = "huffman.in"; private static final String FileOutputName = "huffman.out"; public static void main(String[] args) throws IOException { Scanner scanner = null; PrintStream out = null; try { scanner = new Scanner(new File(FileInputName)); TreeMap map = new TreeMap(); while (scanner.hasNext()) { String s = scanner.next(); ` Integer cost = new Integer(scanner.nextInt()); List list = map.get(cost); if (list == null) { list = new ArrayList(); map.put(cost, list); } list.add(new Node(cost, s.charAt(0))); } if (map.isEmpty()) return; while (map.size() > 1) { Iterator<Map.Entry> it = map.entrySet().iterator(); Map.Entry entry = it.next();
3
Greedy
61
ListIterator listIt = entry.getValue().listIterator(); Node first = listIt.next(); listIt.remove(); if (!listIt.hasNext() && !listIt.hasPrevious()) { it.remove(); entry = it.next(); listIt = entry.getValue().listIterator(); } Node second = listIt.next(); listIt.remove(); if (!listIt.hasNext() && !listIt.hasPrevious()) { it.remove(); } Node newNode = new Node(first, second); List list = map.get(newNode.getCost()); if (list == null) { list = new ArrayList(); map.put(newNode.getCost(), list); } list.add(newNode); } out = new PrintStream(new File(FileOutputName)); map.entrySet().iterator().next().getValue(). iterator().next().writeCosts( out, new ArrayList()); } finally { if (scanner != null) { scanner.close(); } if (out != null) { out.close(); } } } } class Node implements Comparable { private int cost; private char ch; Node left, right; Node(int cost, char ch) { this.cost = cost; this.ch = ch; } Node(Node left, Node right) {
62
Grundlegende Algorithmen mit Java this.left = left; this.right = right; this.cost = left.cost + right.cost; } int getCost() { return cost; } public int compareTo(Node o) { return this.cost - o.cost; } void writeCosts(PrintStream out, List pathPrefix) { if (left == null || right == null) { // Blattknoten out.print(this.ch); out.print('\t'); for (Boolean b : pathPrefix) { out.print(b.booleanValue() ? 1 : 0); } out.println(); } else { pathPrefix.add(Boolean.FALSE); left.writeCosts(out, pathPrefix); pathPrefix.set(pathPrefix.size() - 1, Boolean.TRUE); right.writeCosts(out, pathPrefix); pathPrefix.remove(pathPrefix.size() - 1); } }
} ȱ
Aufgaben ŗǯ Řǯ řǯ
Śǯ śǯ
ȱȱȱ Ȭ§ȱûȱȱ ȱȱãȱǰȱ ȱȱǯȱ ȱǰȱȱȱ Ȭȱ £ȱȱȱ ȱ ûǯȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǰȱ ȱ ȱ £ȱ ȱ Ȭ £ȱ ȱ Ȭ ȱ ûȱ ȱ ȱ ȱ ȱ §ȱ ǯȱ £ȱȱȱȱǰȱȱȱȱ¡ȱȱǰȱȱȱ ȱȱȱǯȱ ȱ ǰȱ ȱ ȱ §ȱ §ȱ ȱ ȱ ȱ ȱ Ƹŗȱ §ȱǯȱ
3
Greedy Ŝǯ
63
ȱǰȱȱȱ£ȱȱ§ȱ§§ȱȱȱ ȱȱ ȬȱȬȱDZȱ Cn =
1 § 2n · ¨ ¸ ǯȱ n + 1 ¨© n ¸¹
ȱ ȱ Řȱȱ ȱ ȱ řȱȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱŗŚȱ§ȱ§§ȱȱŚȱȱ ǯȱȱ ȱ
ȱ
ȱȱ¢ȱ
ȱ
ȱ ȱ ȱ ȱ ȱ ȱ
ȱ ȱȱȱǯȱ§ȱȱ ãȱ
ȱ
Data Ordering Problem
4
ȱ ȱȱ ȱȱ ȱȱȬ§ȱȱǰȱȱȱȬ ȱ ȱ ȱ ȱ ȱ ȱ ãȱ DZȱ £§ȱ ãȬ ǰȱ ¡ȱ ȱ ¢ǯȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ §£ȱ £ȱ ãǯȱ ȱ Ȭ ȱ ȱȱȱ§ǰȱ ȱȱȱȱȱȬ ȱ ǯȱ ȱ ȱ ȱ ȱ £ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £DZȱ Ȭ ǰȱ ȱȱȱȱ§ȱȱȱ¡ȱȬ ȱ ȱ ȱ Ȭǰȱ Ȭȱ ǻǮȱ Ȭ §Ȭ ȃǼǰȱ ȱ ȱ ȱ ȱ §ȱ ȱ ȱ ȱ Ȭ ǰȱ Ȭǰȱ ȱ ûǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ¢ȱǻȱȱȱ ȱŜȱ£ȱǼǰȱȱȱ Ȭ £Ȭǯȱȱ
Problembeschreibung ȱȱȱȱȱȱȱȱ§ ãȱȱ§ȱǻǼǯȱ ȱȱȱǰȱȱûȱȱȱȱȱȱȱǰȱ Ȭ ȱ ȱȱȱ ȱǯȱȱ ȱȱȱȱȱãȱûȬ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ £ȱ ȱ Ȭ ȱ ȱ ȱ ȱ ûǯȱ ȱ ûȱ ȱ ȱ § ǰȱ ȱ ȱ ȱ ȱ ȱȱûǰȱȱ ȱȱȱȱ§ȱȱȱȱ §ȱǯȱȱȱȱȱȱȱȱǯȱȱȱ ȱ§ ȱûȱ ǰȱȱ ȱȱ£ ȱȱȱȱȱ ǮŗȱřȱŜȱŞȃȱûȱȱǰȱ ȱȱȱ£ ȱȱȱȱȱ ȱȱǯȱȱ§ȱȱûȱ ǰȱ ȱȱȱǮŗȱřȱŜȱŞȃȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱȱȱȱŗǰȱřǰȱŜȱȱŞǯȱȱȱȱȱ£ ȱ§ ǯȱȱ ȱȱȱȱ§ȱȱȱ ȱȱ£ ȱȱȱȬ ȱŗȱȱśǯȱȱȱȱȱȱȱȱȱ§ȱȬ ǯȱ ȱ § ȱ ǰȱȱûȱȱ ȱȱ ȱ £ȱ ŖȱŗȱŖȱŖȱŗȱŗȱŗȱŖȱ ŖȱŗȱŖȱŖȱŗȱŗȱŗȱŖȱ Ŗȱ ŗȱŗȱŗȱŖȱŗȱŖȱŗȱŗȱ ŗȱřȱŜȱŞȱ Śȱ ŖȱŗȱŗȱŖȱŖȱŖȱŗȱŗȱ ŗȱśȱ Řȱ ȱ
66
Gundlegende Algorithmen mit Java
ȱǰȱȱȱȱ£ ȱ£ ȱȱȱȱȬ ȱ £ǰȱ £ȱ ȱ ȱ ǯȱ ȱ ȱ ǰȱ ȱ ȱ Ȭ ȱȱãȱȱ§ȱȱ£ ǯȱȱ ǯȱ ȱ ãȱ ȱȱȱȱãȱȱ §ǰȱȱȱ £ȱȱȬ ȱȱ ǯȱȱȱȱȱȱǰȱ£ȱǰȱȱȬ ȱǮȱȱȃǯȱ ȱȱȱȱŗşşŚȱȱȬȱȱǰȱȱȱȱãȱ ȱȱtȱȱȱ ȱãǰȱȱȱ£ȱ ȱ £ȱȱǻǽşŚǾǼǯȱȱ ȱ ȱ ŗǯȱ ȱ ȱ ȱ ȱ § ȱ ȱ ȱ ȱ ǰȱ ȱ £ȱ ȱ ȱ ȱ ȱ £ȱ £ȱ ǻŖȱ →ȱ ŗǰȱ ŗȱ →ȱ ȱ ŖǼǯȱ ȱ w ȱ £ȱ ȱ ȱ ȱ £ ǯȱ ȱ ȱ ȱ ȱ ǯȱ DZȱ ȱ ƽȱ ŗŖŗŗŖŖŖŗǰȱ w ȱȱƽȱŖŗŖŖŗŗŗŖȱȱ 10110 = 01001 ǯȱ ȱ ûȱ ȱ Ȭȱ ǻȱ ƽȱ ȱ ȱ Ǽȱ ȱ ǰȱ ȱ ȱ ȱ § ãȱȱȱȱȱûǯȱȱ ȱȱûȱȱȱǰȱ ȱ ȱȱȱ¡Ȭȱûȱȱ ǰȱȱȱ££ǯȱȱȱȮȱ ȱ ȱ ȱ ȱ ȱ Ȯȱ ȱ Ȭ§ǯȱ ȱ ȱ ȱ ȱ ȱȱȱ¡ȱûȱȱȱ ȱ£ǯȱǯȱȱȱȱ ȱ ȱ ȱ ǻ Ȭ ȱ Ǽǰȱ ȱ ȱ tȱ ȱ ȱ ȱ ȱ ȱȱȱȱȱȱǯȱȱ
Problemdomäne, Definitionen ȱŘǯȱ Ȭ£ǯȱȱ ȱȱȱ ȱȱȱȱ ȱûǰȱ ȱȱ£ȱȱãȱȱȱ k
d ( wr , ws ) = ¦ wrj ⊕ wsj ǰȱȱȱȱ§ȱȱȱãȱȱȱȱǻŗǼǰȱ j =1
ȱ ȱ £ȱ ȱ ȱ Ȭ£ȱ £ ȱ ȱ ȱ ǯȱ ȱ ȱ ǻŗǼȱȱ ȱȱ ȱȱȬȱȱȱȱ§ȱȱ ȱȱȱ⊕ȱȱȱȱȱ¡Ȭ ȱDZȱ ¡ȱ ¢ȱ ¡⊕¢ȱ Ŗȱ Ŗȱ Ŗȱ Ŗȱ ŗȱ ŗȱ ŗȱ Ŗȱ ŗȱ ŗȱ ŗȱ Ŗȱ ȱ DZȱǻŗŖŖŖŗŗŗŖǰȱŗŖŗŗŖŗŗŗǼȱƽȱŚǯȱ
4 Data Ordering Problem
67
£ȱŗǯȱȱȱȱȱȱ£ȱǯȱȱ Ȭ£ǰȱȱȱȱȱȱ ãȱ ȱ §ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱûDZȱ ȱ ǻŗǼȱǻ¡ǰȱ¢Ǽȱ≥ȱŖȱûȱȱ¡ǰȱ¢∈ȱǰȱǻ¡ǰȱ¢ǼȱƽȱŖȱ⇔ȱ¡ȱƽȱ¢ȱ ǻŘǼȱ¢DZȱǻ¡ǰȱ¢Ǽȱƽȱǻ¢ǰȱ¡Ǽȱûȱȱ¡ǰȱ¢∈ȱȱ ǻřǼȱDZȱǻ¡ǰȱ¢Ǽȱ≤ȱǻ¡ǰȱ£ǼȱƸȱǻ£ǰȱ¢Ǽȱûȱȱ¡ǰȱ¢ǰȱ£ȱ∈ȱȱ DZȱ ŗǯȱȱǻ¡ǰ¢ǼȱƽȱŖȱDZȱȱ k
¦ d ( x , y ) = 0 ȱȱȱȱȱBȱȱûȱȱƽŗǰȱdzǰȱȱȱȱ¡ ȱȱƽȱȱ¢ ȱȱǻ¡ ȱȱ¢ ȱȱȱǰȱȱȱȱ j
j
j =1
ãȱ¡ȱȱ¢ȱǼǯȱ ȱ Řǯȱȱ¢ȱȱȱȱȱ¢ȱȱȱ⊕ǯȱ řǯȱȱȱǰȱȱȱãȱ¡ǰȱ¢ȱȱ£ȱȱ§ȱ¡ŗǯǯǯ¡ǰȱ¢ŗǯǯǯ¢ȱȱ £ŗǯǯǯ£ȱǯȱȱȱȱûȱãȱȱ§ȱŗȱ ȱȱ ȱȱȱǰȱȱȱȱ ǰȱȱȱ ȱûȱȱûȱǻǰȱǼȱȱǻǰȱǼƸǻǰȱǼȱȱDZȱ ȱȱûȱǻǰȱǼȱȱǻǰȱǼȱƸȱǻǰȱǼȱ
ȱ Ŗȱ Ŗȱ Ŗȱ Ŗȱ ŗȱ ŗȱ ŗȱ ŗȱ
ȱ Ŗȱ Ŗȱ ŗȱ ŗȱ Ŗȱ Ŗȱ ŗȱ ŗȱ
ȱ ǻǰȱǼȱ ǻǰȱǼȱƸȱǻǰȱǼȱ Ŗ Ŗȱ Ŗȱ ŗ Ŗȱ Řȱ Ŗ ŗȱ ŗȱ ŗ ŗȱ ŗȱ Ŗ ŗȱ ŗȱ ŗ ŗȱ ŗȱ Ŗ Ŗȱ Řȱ ŗ Ŗȱ Ŗȱ
ȱ ȱȱǰȱȱȱȱûȱȱãȱȱ§ȱŗȱûȱǰȱ ȱȱǰȱȱȱȱûȱãȱȱ§ȱ ȱǰȱ ȱ ȱȱȱȬ ǯȱ÷ȱ ȱ ȱřǯȱ £ȱȱǯȱ ȱȱȱ§ ãȱ ŗǰȱ Řǰȱǯǯǯǰȱ ǰȱ ȱ ȱ σȱ ǻȱ ȱ ȱ ȱ ȱ Ȭȱ ȱ
68
Gundlegende Algorithmen mit Java
ȱ ǿ ŗǰȱ Řǰȱ ǯǯǯǰȱ ȀǼȱ ȱ ȱ ȱ δȱ ǻȱ ȱ ȱ ȱ ȱǿŗǰȱŘǰȱǯǯǯǰȱȀȱȱȱȱǿŖǰŗȀǼǰȱȱûȱȱȱǰȱ ȱȱȱȱȱǯȱȱ £ȱȱȱȱȱDZȱ ȱ
NT =
n −1
¦ d (wσδ j =1
( j) δ ( j +1) ( j ) , wσ ( j +1) ) ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǻŘǼȱ
ȱŚǯȱ££¡ǯȱûȱȱ£ȱȱȬȱȱȬȱǻ ȱ ȱ ȱ £ȱ ȱ ãȱ ȱ ȱ ȱ §ȱ Ǽȱ ȱ ȱ ȱ ££¡ȱ ƽǻǼȱȱȱȱƽȱǻ ǰȱ Ǽǯȱ ȱ DZȱûȱȱƽȱřȱȱȱƽȱśȱȱȱ££¡ȱûȱȱãȱ ŗȱƽȱŖŖŖŗŗǰȱ Řȱƽȱ ŗŖŗŗŖȱȱ řȱƽȱŖŗŖŗŗȱȱDZȱ ȱ §0 3 1· ȱ ¸ ¨ ȱȱ A = ¨ 3 0 4¸ ¨ 1 4 0¸ ȱ ¹ © ȱ ǻȱǻ ŗǰȱ ŗǼȱƽȱŖǰȱǻ ŗǰȱ ŘǼȱƽȱřǰȱǻ ŗǰȱ řǼȱƽȱŗǰȱdzȱǼǯȱȱ ȱ £ûȱȱ££¡ȱȱȱDZȱ ŗǯȱȱ££¡ȱȱ¢ȱ£ȱ ǯȱȱȱ¢ȱȱ
Ȭ£ȱȱȱ ȱ
d ( wi , w j ) = d ( w j , wi ) aij = a ji ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǻřǼȱ ȱ Řǯȱȱȱȱȱ ȱȱǯȱȱȱȱȱ Ȭ £ȱǰȱȱ ȱ d ( wi , wi ) = 0 a ii = 0 ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǻŚǼȱ ȱ řǯȱȱ££¡ȱ§ȱȱǰȱ ȱȱȱãȱǯȱ ȱ
d ( wi , w j ) = d ( wi , w j ) ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǻśǼȱ ȱ Śǯȱȱȱȱ§ȱȱãȱǰȱȱ ȱ
4 Data Ordering Problem
69
d ( wi , w j ) = d ( wi , w j ) = k − d ( wi , w j ) = k − aij ȱȱȱȱȱȱȱȱȱȱȱǻŜǼȱ śǯȱȱ ȱȱãȱȱȱûǰȱ ȱȱȱǰȱ ȱȱ ȱȱ ȱ §ȱ ȱ ãȱ ȱ ûǰȱ ȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ
ȱǯȱ ȱŗǯȱ ȱȱȱƽȱřǰȱȱƽȱŗŘȱȱȱãȱ ȱ ŗȱƽȱŖŗŖŗŖŖŗŗŗŖŖŖȱȱȱȱȱȱȱȱ ŘȱƽȱŖŖŗŖŗŖŗŖŖŗŗŖȱȱȱȱȱȱȱȱ řȱƽȱŖŖŗŗŗŗŖŗŗŖŗŗȱȱȱȱȱȱȱȱ ȱ ȱȱȱ££¡ȱ ȱ § 0 8 7· ȱ A = ¨ 8 0 7¸ ¨ ¸ ȱ ¨ 7 7 0¸ © ¹ ȱ ȱ ȱȱãȱ ȱȱǰȱȱȱ £ȱȱȱ ȱ
N T = a12 + a 23 = 15
ȱ ȱȱȱ£ ȱȱǰȱȱ ȱ
N T = ( k − a12 ) + ( k − a 23 ) = (12 − 8) + (12 − 7) = 9 ȱ ȱ
ȱŚŖȱ£ȱǯȱ ȱŘǯȱûȱȱƽȱŝǰȱȱƽȱŗśȱȱȱãȱ ȱ ŗȱƽȱŖŖŗŖŗŖŗŖŖŗŗŖŗŗŖȱȱȱȱȱȱȱȱ ŘȱƽȱŖŖŖŖŖŖŖŖŗŗŗŗŗŗŖȱȱȱȱȱȱȱȱ řȱƽȱŖŖŗŗŗŗŖŗŗŖŗŖŖŗŖȱȱȱȱȱȱȱȱ ŚȱƽȱŖŖŖŖŗŖŖŗŗŗŗŖŗŗŗȱȱȱȱȱȱȱȱ śȱƽȱŖŖŖŖŖŗŗŗŗŖŗŗŖŗŗȱȱȱȱȱȱȱȱ ŜȱƽȱŖŖŖŗŗŖŖŗŖŖŖŗŗŖŖȱȱȱȱȱȱȱȱ ŝȱƽȱŖŖŖŖŖŗŖŗŖŖŖŗŗŗŖȱȱȱȱȱȱȱȱ ȱ ȱ ȱȱ££¡DZȱ
70
Gundlegende Algorithmen mit Java
ȱ §0 5 7 ȱ ¨ ¨5 0 8 ȱ ¨7 8 0 ȱ ¨ A = ¨5 4 6 ȱ ¨9 6 6 ¨ ȱ ¨8 7 7 ȱ ¨ ©8 5 7 ȱ ȱ ȱ ȱ ȱ ȱ
5 9 8 8· ¸ 4 6 7 5¸ 6 6 7 7¸ . ¸ 0 6 7 7¸ 6 0 9 5 ¸¸ 7 9 0 4¸ ¸ 7 5 4 0¹
ãȱ ȱ ȱ ǰȱ ȱ ȱ ȱ £ȱ ȱ 6
N T = ¦ a t ,t +1 = 38 ȱ t =1
ȱ ȱȱãȱȱȱȱ ŗǰȱ Řǰȱ Śǰȱ řǰȱ śǰȱ ŝǰȱ Ŝȱǰȱȱ
NT = a12 + a24 + a43 + a35 + a57 + a76 = 30 ȱ ȱȱȱ£ȱȱŘŜǯŝȱ£ǯȱ ȱ ȱřǯȱ ȱȱȱƽȱŞǰȱȱƽȱŗřȱȱȱãȱ ȱ ŗȱƽȱŗŗŗŗŖŗŖŗŗŗŖŖŗȱȱȱȱȱȱȱȱ ŘȱƽȱŗŖŗŖŗŖŖŗŗŖŗŗŖȱȱȱȱȱȱȱȱ řȱƽȱŖŖŖŖŖŖŗŗŗŗŗŗŖȱȱȱȱȱȱȱȱ ŚȱƽȱŗŗŗŗŖŗŗŖŗŖŖŗŖȱȱȱȱȱȱȱȱ śȱƽȱŖŖŖŗŗŗŗŖŗŗŖŗŗȱȱȱȱȱȱȱȱ ŜȱƽȱŖŗŗŖŖŗŖŖŖŗŗŖŖȱȱȱȱȱȱȱȱ ŝȱƽȱŖŖŖŗŖŗŖŖŖŗŗŗŖȱȱȱȱȱȱȱȱ ŞȱƽȱŗŖŖŖŗŗŖŗŗŖŗŖŖǯȱ ȱ
ȱȱ££¡DZȱ ȱ ȱ § 0 8 9 5 7 6 8 7· ¨ ¸ ȱ ¨ 8 0 5 7 9 8 8 3¸ ȱ ¨ 9 5 0 8 6 7 5 6¸ ¨ ¸ ȱ ¨ 5 7 8 0 6 7 7 8¸ ǯ ȱ
A=¨
¸
ȱ ¨ 7 9 6 6 0 9 5 8¸ ¨ 6 8 7 7 9 0 4 7¸ ȱ ¨ ¸ ȱûȱȱãȱ ȱǯȱȱȱ 8 8 5 7 5 4 0 7
¨ ¸ ¨ 7 3 6 8 8 7 7 0¸ © ¹
4 Data Ordering Problem
71 7
N T = ¦ a t ,t +1 = 47 ȱ t =1
ȱûȱ ȱȱDZȱ ȱ
w1 → w3 → w4 → w8 → w2 → w5 → w6 → w7 ȱ ȱ ȱ£ȱȱȱ£ȱȱȱȱřŞǰřȱ£ǰȱȱ ȱ
N T = (13 − a13 ) + (13 − a34 ) + (13 − a 48 ) + a82 + (13 − a 25 ) + a56 + a 67 = 29 ȱ
ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱȱãȱȱ ȱȱãǯȱȱȱ ȱ ȱ ȱ ȱ ȱ §ȱ ǰȱ ãȱ ȱ ȱ ¡ȱ ȱ ǰȱȱȱȱãȱ£ȱǯȱȱȱȱȱȱ ǰȱûȱ ȱ ȱ ȱ ǰȱ ȱ ãȱ ȱ ãȱ ǰȱ ȱ ȱ ¡ȱ ȱȱȱȱȱǯȱ ȱ ȱśǯȱȱǻȱȱǼȱȱȱȱȱσȱȱȱȱ ãȱ ŗǰȱ Řǰȱdzǰȱ ǰȱȱȱȱ £ȱȱȱ n −1
ȱ
ȱ
NT = ¦ d ( wσ ( j ) , wσ ( j +1) ) ȱ
ȱ
ǻŝǼȱ
j =1
ȱ ǯȱ ȱ ȱŜǯȱȱǻȱȱȱȱǼȱȱȱȱȱ σȱȱȱ ȱδȱȱȱȱãȱ ŗǰȱ Řǰȱdzǰȱ ǰȱȱȱȱ £ȱ ȱȱ ȱ
NT =
n −1
¦ j =1
ȱ
d ( wσδ (( jj )) , wσδ (( jj ++11)) ) ȱ
ǻŞǼȱ
ȱ ǯȱ
DOP und DOPI sind NP-vollständig ȱ ǽşśǾȱ ȱ ǰȱ ȱ ȱ ȱ Ȭ§ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ £ȱ ãȱ DZȱ ȱ ȱ ǻȱ ȱ ȱ Ȯȱ Ǽǰȱ ȱ ȱ ȱ ¡ȱ ȱ ǻȱ ȱ ȱ ¡ȱ ȱ Ȯȱ ȬǼȱ ȱ ¢ȱ ǻȱ ǰȱȱǰȱȱȱǼǯȱ
72
Gundlegende Algorithmen mit Java
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ
ȱ ȱ ǵȱ ǰȱ ûȱ ȱ Ȭ§ȱ ȱ ȱ ȱ ȱ ¢ȱ ȱ ǯȱ ûȱ ȱ ǰȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ûȱ ȱ Ȭ§ȱ ȱ ȱ ¢ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ǰȱ ȱ £ȱ ȱ ȱ ȱ ¢ȱ ãȱ ȱ ȱ £ȱ ǯȱ ȱ §ȱ ȱ ȱ ȱ ȱ ȱǰȱ ȱȱ£ȱ§ǯȱ ȱ ȱ ãȱǰȱȱȱȱȱȱȱ ȱȱȱ ȱȱȱȱȱȱȱȱ ǰȱȱ£ȱȬ§ǯȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ǰȱ ǰȱ £ Ȭ ǰȱȱȱǰȱȱȱǰȱǰȱȱȱȬ ǰȱȬȱȱǰȱǰȱ ǯȱȱ ȱ ȱ ȱ ȱȱȱȱȱ ǯȱȱ £ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ § ãȱ ŗǰȱ Řǰȱ ǯǯǯǰȱ ȱ ȱ §ȱ ȱ ǯȱȱ ǯȱ ȱȱȱȱ σȱȱȱ ȱ δȱȱȱ ŗǰȱ Řǰȱdzǰȱ ȱ ȱ ãǰȱȱȱ
NT =
n −1
¦ d (wσδ j =1
( j) δ ( j +1) ( j ) , wσ ( j +1) )
≤ m ȱȱȱȱȱȱǻşǼȱ
ȱ δ ( wi ) = wi ȱȱ δ ( wi ) = wi ǵȱ ȱ ȱ ǰȱ ȱ ȱ Ȭ§ȱ ǰȱ ȱ ȱ ȱ ǰȱ ȱ ȱ Ȭ ȱ§ȱ ȱǰȱ ȱȱȱãđȱȱ£ûȱȱȬ ȱǯȱȱ ȱȱȱ ǰȱȱȱȬ§ȱǯȱ
Algorithmen für DOP und DOPI ûȱȱãȱ ȱȱ¢ȱȱȱǰȱȱȱ ȱ ȱȱ ȱ ȱ ȱ ȱ ȱ ãǯȱ ûȱ ȱ £ȱ ȱ ȱ ȱ ȱ § ãȱ ȱ §ȱ ȱ ȱ ȱ ȱ ȱ ȱ §ȱ ȱ ǻȱ ȱ ãǼȱ ȱ ȱ ȱ ȱ §ȱ ȱ ǻȱ ȱ ȱ ãǼǯȱ ȱ ȱ ȱ £ȱ ȱ ȱ DZȱ Ȭǰȱ ¡Ȭǰȱ£ ȱ ¢Ȭȱȱ£ȱȱȱȱȱ ȱǻǯȱ ȱǼǰȱȱȱȱȱǯȱ ȱ ȱ ȱ
4 Data Ordering Problem ȱȱȱãȱ ȱ ȱ §0 ¨ ŗȱƽȱŖŗŖŗŗŖŖŗŗȱ ¨5 ŘȱƽȱŗŖŗŗŗŖŖŖŖȱ ¨5 ¨ řȱƽȱŖŖŗŖŖŖŖŖŗȱȱȱȱȱȱȱȱȱȱ ££¡ȱŞşƽȱ ¨ 4 ŚȱƽȱŗŗŗŖŗŖŖŖŗȱ ¨ ¨5 śȱƽȱŗŗŗŖŗŗŗŗŗȱȱȱȱȱȱ ¨4 ŜȱƽȱŖŖŖŗŖŗŗŗŗȱ ¨ ¨4 ŝȱƽȱŗŖŖŖŗŖŖŖŗȱ ¨6 ŞȱƽȱŖŖŗŖŖŗŗŗŗȱ ©
73
5 5 4 5 4 4 6· ¸ 0 4 3 6 7 3 7¸ 4 0 3 6 5 3 3¸ ¸ 3 3 0 3 8 2 6¸ ¸ 6 6 3 0 5 5 3¸ 7 5 8 5 0 6 2¸ ¸ 3 3 2 5 6 0 6¸ 7 3 6 3 2 6 0 ¸¹
ȱ ȱ£ȱȱ£ȱȱŞşȱǻ ȱƽŞȱȱƽşȱǼȱȱ ȱȱ ȱ £ûǰȱ ȱ ȱ ãȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ǯȱ đȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ £ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ûȱ ȱ ǰȱ ȱ ȱ ãȱ ȱ ȱȱȱȱȱȱûȱ ǰȱȱřŘǯȱ
Zufällige-Lösung-Algorithmen (RAN) ȱ§ȬãȬȱûȱȱȱȱ£§ȱȱȱ ȱȱ£ȱȱȱȱ ȱǯȱûȱȱȱȱ £§£ȱȱ£§ȱǰȱȱȱȱ ǯȱ ȱ ȱ ȱ ȏȱȏǻǰȱǰȱ ŗǯǯ Ǽȱ ȱ ȱ←ȱȱȱ ȱǰȱǻǼȱ ȏȱ ȏȱȏǻǰȱǰȱ ŗǯǯ Ǽȱ
ȏȏǻǰȱǰȱ ŗǯǯ Ǽȱ ȱ←ȱȱȱ ȱ←ȱȱȱ ȱǰȱǰȱǻǰȱǼȱ ȏȱ ȏȏǻǰȱǰȱ ŗǯǯ Ǽ
74
Gundlegende Algorithmen mit Java
£ûȱŞşȱȱȱȱȱ£ȱȱûȱȱȱǻŝǰȱŞǰȱŚǰȱŘǰȱřǰȱśǰȱ Ŝǰȱ ŗǼȱ ȱ ȱ řŚǯȱ ȱ ȱ ȱ ûȱ ȱ ȱ ǻŝǰȱŗǰȱ řǰȱ Şǰȱśǰȱ ŘǰȱŚǰȱ ŜǼȱ ȱȱ ȱǻŖǰȱŗǰȱŖǰȱŗǰȱŗǰȱŗǰȱŖǰȱŖǼȱ ȱȱřŞȱǯȱȱ ¡§ȱȬ ȱȱȱǻǼǯȱ
Exakt-Algorithmen (EX) ȱ¡Ȭȱûȱȱȱȱȱȱȱȱǰȱ ȱ £ȱ ȱ ȱ ûǯȱ ȱ ûȱ ȱ ȱ ȱ ȱ ǻǰȱ Ǽȱ ȱ ȱ ȱ ǰȱ ȱ £ȱ ȱ ȱ ûǯȱ ȏȱ ȏǻǰȱǰȱ ŗǯǯ Ǽȱ ȱ←ȱȱǻǼȱ ȱ←ȱȱǻǼȱ ȱǻȱǻǼȱǼȱ¡ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱȱȱȱǻȱǻǼȱǼȱ¡ȱ ȱȱȱȱȱȱȱǻǻǰȱǼǀǻǰȱǼǼȱȱ ȱȱȱȱȱȱȱȱȱȱȱ←ȱȱ ȱȱȱȱȱȱȱȱȱȱȱ←ȱȱ ȏȱȱȱȏȱȱȱȱȏȱ ȱǰȱǰȱǻǰȱǼȱ ȏȱ ȏȱ ȏǻǰȱǰȱ ŗǯǯ Ǽȱ
£ûȱŞşȱȱ ȱȱȱûȱȱȱǻŗǰȱŜǰȱŞǰȱřǰȱŘǰȱŝǰȱŚǰȱśǼȱȱ ȱ ȱ Řŗǯȱ ȱ ȱ Ȭ ȱ ȱ ȱ ȱ ŗŜǰȱ ȱ ȱ ȱûȱȱȱǻŗǰȱŞǰȱŘǰȱŜǰȱŚǰȱŝǰȱřǰȱśǼȱȱȱ ȱǻŖǰȱŗǰȱŖǰȱŗǰȱŖǰȱŖǰȱŖǰȱŗǼȱ ǯȱ ȱ ¡§ȱ ȱ ȏȬȱ ȱ ǻǷǼǰȱ ȱ ȱ ȏȬ ȱȱǻǷȉŘǼǯȱȱ
Greedy_Min-Algorithmen (GM) ȱȱ ¢ȏȬ£ȱãȱ ȱ ȱȱȱȱǯȱ ȱDZȱ • ȱȱ ȱûȱȱãȱãȱȱȱȱȱ ǰȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ûȱ ȱ ãȱ ûȱ ȱ ǯȱ
4 Data Ordering Problem • •
75
ȱȱȱȱ£ǯȱ §ȱ ȱ £ǰȱ ȱ ȱ ȱ ȱ ǮȄȱ ȱ ȱȱȱȱȱȱȱȱ£ȱ£ûȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ûȱ ûȱ ȱ ȱ §ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ ȱ £ȱȱǯȱȱȱȱȱȱȱȱ ǯȱ
ȱ ȱ ¡§ȱȱȱȱ¢ȱǻŘǼǯȱûȱŞşȱȱȱȱ ȱ ȱ ȱ ǻśǰȱ ŗǰȱ Ŝǰȱ Şǰȱ řǰȱ Śǰȱ ŝǰȱ ŘǼȱ ȱ ȱ ŘŘȱ £ǯȱ ȱ ȱ ȱȱȱȱȱǻśǰȱřǰȱŝǰȱŚǰȱŜǰȱŘǰȱŞǰŗǼȱȱȱ ȱȱǻŗǰȱŖǰȱŖǰȱŖǰȱŗǰȱ ŖǰȱŗǰȱŖǼȱ ȱȱŗŜǯȱ
Greedy_Min Simplified-Algorithmen (GMS) ȱ ȱ ȱ ¢ȏȬ£ȱ ǻ Ǽȱ ȱ ǯȱ ȱ £ȱ ûȱ ȱ ãȱ ȱ ȱ ȱ ȱ £ûȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ đȱ £ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱȱ ¡§ȱȱȱȱȱ¢ȱǻŘǼǯȱ ȱ £ûȱŞşȱȱȱȱȱȱȱǻŚǰȱŝǰȱŘǰȱřǰȱŞǰȱŜǰȱŗǰȱśǼȱȱ Ȭ ȱȱŘřȱȱȱȱȱȱǻŚǰȱŜǰȱŞǰȱŗǰȱŘǰȱŝǰȱřǰȱśǼǰȱȱ ȱǻŖǰȱŗǰȱ ŗǰȱŖǰȱŗǰȱŗǰȱŗǰȱŖǼȱȱȱ ȱŗşǯȱ
Algorithmen mit unterer Schranke (LB) ȱ ȱ ȱ ȱ ȱ ãȱ ûȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ûȱ ȱ ȱ ȱ ȱ §ȱ ǰȱ ȱ ȱ ȱ
ȱ ȱ ȱ ãȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ£ȱ ȱ ȱ ȱ ǯȱ ȱ Ȭ£ȱ £ ȱ ãȱ §ȱ ȱ ǰȱ ȱ ȱ ȱ ãȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ãȱ ûȱ ȱ ǻȱ ǰȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ǼDZȱ d ( wi , w j )
= d ( wi , w j ) ȱȱ d ( wi , w j ) = d ( wi , w j ) ǯȱ
ûȱȱ£ȱ ȱȱǰȱȱ ȱ£ ȱ ȱȱ£ ȱ ȱ ǰȱȱûȱȱǯȱȱȱ ȱûȱ ȱȱȱ ȱȱȱǰȱȱȱ ȱǰȱȱȱȱ ȱȱȱȱȬ§ǯȱȱ ȱ ȱȱȱȱ ȱ£ ǯȱȱȱȱȱȱ§ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱđǯȱȱȱãȱȱȱǻȱȱ¡ȬȱǼȱȱ ȱ ȱ ȱ đȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ
76
Gundlegende Algorithmen mit Java
ȱ ȱ ǻǯȱ ȱ Ǽȱ ãȱ ȱ ȱ đȱ £ȱ ȱ §£ǰȱ ȱ ȱ ȱ ¢Ȭȱ ǰȱ ȱ ȱ ¡Ȭȱ ãȱ ȱȱȱȱ£ȱȱȱ£ǯȱ ȱ ȱ £ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ £ȱ ǰȱ ȱȱȱǻ ȱȱ Ǽȱȱȱȱ ȱǻ ȱȱ Ǽǯȱ ȱ £ȱ ȱ Ȭȱ ǰȱ ȱ ȱ ȱ ȱ ȱ Śȱ ȱ ȱ ¢Ȭ ȱȱǯȱ ȱ £ûȱŞşȱȱ ȱȱȱȱDZȱǻŚǰȱŝǼȱȬǁȱŘȱȩȱǻŜǰȱŞǼȱȬǁȱŘȱȩȱǻŘǰȱŚǼȱȬǁȱ řȱȩȱǻřǰȱŚǼȱȬǁȱřȱȩȱǻřǰȱŞǼȱȬǁȱřȱȩȱǻŚǰȱśǼȱȬǁȱřȱȩȱǻŗǰȱŚǼȱȬǁȱŚǯȱ ȱ w1 ȱ ȱ 4 ȱ w2 ȱ 3 ȱ 3 w4 w8 2 w6 w3 3 ȱ 3 ȱ 2 ȱ w5 ȱ ȱ ȱ w7 ȱ ȱȱûȱǰȱŞşȱ
ȱ ȱ ȱȱȱȱŘŖǯȱȱ ȱ ȱȱ£ȱ ȱȱȱǻŚǰȱŜǼȱȬǁȱŗȱȩȱǻŘǰȱŜǼȱȬǁȱŘȱȩȱǻŘǰȱŞǼȱȬǁȱŘȱȩȱǻŚǰȱŝǼȱȬǁȱŘȱȩȱǻŗǰȱŞǼȱȬ ǁȱřȱȩȱǻŘǰȱśǼȱȬǁȱřȱȩȱǻřǰȱŚǼȱȬǁȱřȱȱȱ ȱŗŜǯȱ ȱ ȱ
ȱ ȱ ȱ ȱ ȱ ȱ
w3 w4
3 1 2
w6
2
3
w2
w5
2
w8
3
w1
w7 ȱȱûȱǰȱŞşȱǻȱȱûȱãȱȱȱȱ ȱ£ǰȱȱȱȱȱ ǯǼȱ
ȱ ȱ ¡§ȱȱȱȱ¢ȱǻŘǼǯȱ
4 Data Ordering Problem
77
Implementierungsdetails ȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ £ȱ ȱ ȱ ǯȱ ȱ ûȱ ȱ £ȱ ȱ ǰȱ ȱ ȱ ãȱ ȱ ȱ ǰȱ ȱ ȱ £ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱǯȱȱȱȱǰȱȱȱȱȱ§ȱȱȬ ȱȱȱȱ §ȱȱ£ȱ£ǯȱȱûȱȱȱ ȱȱȱȱ ȱȱȱȱǯȱ ȱ ȱȱǯǯȱȱȱȱȱǽǾǯȱ ȱȱȱ ȱŖŗȏȱȱȱDZȱ Ȭ DZȱ£ȱȱȱ§ ãDzȱ Ȭ DZȱ§ȱȱãDzȱ Ȭ ǽǾDZȱȱ¢ȱȱȱȱ¢ȱǰȱȱȱãȱDzȱ Ȭ ǽǾǽǾDZȱ£ ȱ¢ȱûȱȱ££¡Dzȱ Ȭ ǽǾDZȱ¢ǰȱȱȱȱûȱ ǽǾȱDzȱ Ȭ DZȱȱ ȱȱ¢ȱȱûȱȱãȱ ǽǾǯȱ ȱ ȱ ȱ Ŗŗȏǻȱ ǰȱ ȱ Ǽȱ ȱ ȱ £§ȱ § ãȱ ȱ ǽǾǰȱ ȱ ȱ ȱ ȱ ȱ ££¡ȱ ȱ ȱ ȱ ȱ ǻǼȱ ȱ ȱȱȱȱǽǾȱȱȱȱǯȱ ȱ ȱȱȱDZȱ Ȭ ǻǼDZȱȱ£§ȱ §ȱȱȱȱȱ ǽǾȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯǻǼȱ ȱ ȱ ȱ ǯDzȱ Ȭ ǻǼDZȱȱȱ ȱûȱȱȱȱǽǾȱȱȱ ££¡ȱǽǾǽǾǰȱȱȱȱ£ȱȱȱDzȱ Ȭ ǻǼDZȱ ȱ ȱ ȱ ǽǾȱ ȱ ȱ ȱ Ȭ
ȱ£ûDzȱ Ȭ ǻǼDZȱ ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ǽǾȱ ȱ ȱ ȱ ȱ DZȱ ûȱ ȱ ȱ ȱ ãȱ w permi ȱ
w permi −1 ȱ ȱ a[ permi −1 ][ permi ] ȱ£ȱȱǰȱ ȱǽǾȱƽȱǽȬŗǾȱǰȱ
ȱȱ ȱȬ a[ permi −1 ][ permi ] Dzȱ Ȭ
ǻǼDZȱ ȱ ȱ ȱ ǽǾǰȱ £ȱ £§ȱ ȱ ȱ ȱȱȱȱȱ ȱ£ûDzȱ
ȱ ûȱȱ¡ȱȱûȱȱȱȱûȱ ȱȱȱȱ §ȱȱǯȱȱ ȱûȱȱȬǰȱȱȱȱ ǽŖŜǾȱȱȱŗŝřȱȱǯȱȱ
78
Gundlegende Algorithmen mit Java
ȱ£ȱ ǰȱ ȱȱȱȱȱȱǻŗǰȱŘǰȱdzǰȱǼȱǯȱ ȱ ȱ ȱȱDZȱ ȱ ȏ ȏǻǰȱǼȱ ȱ ŗǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰ ȱȱǀȱƸŗȱǻŗ≤ǀǼȱûǯȱ ȱŘǯȱûȱȱȱȱȱȱȱȱȱȱ ȱȱǰȱȱȱǁȱȱȱǻǀǼȱûǯȱǻȱȱȱȱ ǰȱȱȱȱȱ£ǰȱȱ§ȱȱƸŗǼǯȱ ȱřǯȱȱȱȱȱȱȱȱǯȱ ȱŚǯȱȱȱȱ£ȱƸŗƸŘdzȱǯȱ ȱȱȱȱȱȱȱȱǻǼȱ ȏȱ ȏ ȏǻǰȱǼȱ ȱ ȱ ȱȱ ȱ ¡ȱ ǰȱ ȱ ãđȱ ȱ ȱ Ȭ ȱȱǯȱDZȱȱȱȱƽȱŜȱȱ ȱ ȱȱȱȱȬ ȱǻŜǰȱřǰȱśǰȱŚǰȱŘǰȱŗǼȱǯȱȱȱȱȱȱȱȱǀȱƸŗȱȱŘȱǻ ȱřȱǀȱśȱȱ ȱȱȱȱȱȱȱȱûǼǯȱ£ûȱȱƽȱŘȱȱ ŚȱƽȱŚȱ ȱȱȱȱǰȱȱãđȱȱŘȱƽȱřȱǯȱȱȱȱŘȱȱŚȱ ȱȱȱǻŜǰȱŚǰȱśǰȱřǰȱŘǰȱŗǼǯȱȱȱȱ£ǰȱȱȱȱŘȱȬ ȱǻśǰȱřǰȱŘǰȱŗǼǰȱûȱđȱ£ȱǻŜǰȱŚǰȱŗǰȱŘǰȱřǰȱśǼǰȱȱ¡ȱȬ ȱȱȱȱǻŜǰȱřǰȱśǰȱŚǰȱŘǰȱŗǼǯȱȱ ȱ ȱ£ ȱȱȱ¢ȱ£ȱǰȱȱ ȱȱȱ ǻǼǰȱȱ ȱ ǮȬ §ȬȄȱ ǯȱ ȱ ȱ £ ȱ ȱ ȱ ȱ ȱȱȱȱȱ ȱȱȱ£ ȱȱȱǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
4 Data Ordering Problem
79
ȱȱȱȱ ȱȱ ȱDZȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ 3 ȱ 1 ȱ ȱ ȱ 2 ȱ ȱ ȱ ȱ ȱȱDZȱ ȱ ȏǻǰȱǼȱ ȱ ȱȱ¡ȱƜȱȱ ȱ ȱȱȱȱȱȱȱƜȱȱ ȱ ȱȱȱȱȱȱƜȱ¡ȱ ȱ ȏȱ ȏȱǻǰȱǼȱ ȱ ȱ ȱȱ£ȱȱȱ¢ȱ£ǰȱ ȱ ȱȱȱ ǻǼǰȱ ȱ ȱ ȱ £ ȱ ȱ £ȱ ȱ ȱ ȱ ǻđȱ ȱ ȱ Ǽȱ ǯȱ ȱ ȱ£ȱȱȱȱȱ£DZȱ ȱ ȏǻǽǾǰȱǰȱǼȱ ȱ i + j −1 ȱ ȱȱȱȱȱƜ ȱ ȱ 2 ȱ ȱȱȱǻƜȱDzȱ≤ȱDzȱȱŗǼȱ ȱ ȱȱȱȱȱȱǻǽǾǰȱǽƸȬǾǼȱ ȱ ȏȱ ȏǻǽǾǰȱǰȱǼȱ ȱ ȱ ȱȱȱȱȱ£ȱǽǯǯǾȱDZȱǽǾȱȱǽǾǰȱǽƸŗǾȱ ȱǽȬŗǾǰȱǽƸŘǾȱȱǽȬŘǾǰȱǯǯǯȱȱđǰȱȱȱȱȱ£ȱȱƸȱ ǰȱȱȱ ȱȱǽǾȱȱǽƸȬǾǯȱȱ ȱ
80
Gundlegende Algorithmen mit Java
ȱãȱ ȱȱȬȱȱȱDZȱ ȱ ȏŘǻǽǾǰȱǰȱǼȱ ȱ ȱȱȱǻȱȱǀȱȱǼȱȱ ȱ ȱȱȱȱȱǻǽƸƸǾǰȱǽȬȬǾǼȱ ȱ ȱȱȏȱ ȱ ȏȱ ȏŘǻǽǾǰȱǰȱǼȱ ȱ ȱ ȱ ȱ ¡ǻǼȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱǰȱ ȱȱȱǰȱȱȱȱȱȱȱȱ£ûǯȱȱȱ ȱ Ȭȱ ǰȱ ȱ ȱ ȱ £ûǯȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭȱ ȱ ȱ ȱ ǻǼȱ ȱ ǻǼȱ ǯȱ ȱ ǰȱ ȱ ȱ ȱ ¢ǯ¢¢ǻǼȱ ȱ ȱ ȱ ǯȱ ȱ ǰȱȱȱȱ£ȱȱȱ¢ȱȱȱȱǯȱ ȱ ȱ ȱ ¡ǻǼȱ ȱ ȱ ȱ ãȱ ȱ ȱ £ãȱ
ǰȱ ȱ ȱ ȱ ȱ ȱ ¡ȱ ȱ §ȱ ȱȱȱ£ȱȱȱȱȱãȱȱȱȱȱȱȱ
ȱȱȱǯȱȱ ȱ ȱ ȱ ¡ȱ ȱ ȱ £ȱ ǰȱ ûȱ ȱ ȱ ȱ ȱ §ȱ ȱ ¢ǯȱ £ȱ ȱ ȱ ȱ ȱ ¡ȏǻǼǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ûǰȱ ȱ ȱ ȱ ǰȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ Ȭǰȱ ȱ ȱ ȱ ǽŖŜǾǰȱ ȱ ŗŜŞǰȱȱ DZȱ ȱ ȱ ȏ ȏȱǻ¡Ȭŗǰȱ¡ȬŘǰȱdzǰȱ¡ŗǰȱ¡ŖǼȱ ŗǯ ȱ←ȱȱȱ¡ȱȱ¡ȱƽȱŖȱȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ Řǯ ȱǻ¡ȱȱ¡Ǽȱȱ ȱ ȱ ¡ȱ ƽȱ Ŗǯȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱȱȱȱȱȱȱȱȱȱȱȱǻ←ŖDzȱǀDzȱȱŗǼȱ¡ȱ←ȱŖȱȱ ȱ ȱ¡ȱ←ȱŗȱȱ¡ȱ←ȱŖȱûȱȱȱ≤ȱ ȱ Ȭŗǯȱȱ ȱȱȱȱȱȱȱȱȱȱȱ¡ȱ←ȱŗȱ ȱ DZȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱȱȱȱȱȱȱȱȱȱǻŗŖŖŖŗŗŗǼƽŗŖŖŗŖŖŖȱǻƽřǼȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȃȱȱȱǷȄȱȱȱȱ ȱ ȏȱ ȏ ȏȱǻ¡Ȭŗǰȱ¡ȬŘǰȱdzǰȱ¡ŗǰȱ¡ŖǼȱ ȱ ¡ǻǼȱȱȱȱãȱûȱȱȬǰȱȱȱȱȬ ȱǻǰȱǼȱȱȱ ȱûǰȱȱȱȱȱȱǻȬ ȱ Ǽȱȱȱȱǯȱȱǰȱ ȱȱȱȱǻǰȱǼȱǯȱ ȱ ȱ
4 Data Ordering Problem
81
ȱ ¢ȬȬȱ ȱ ȱ ȱ ȱ ȱ ǻǼȱ Ȭ ǯȱȱ ȱȱȱ ȱȱ ȱǻŖǰȱŖǼȱȱȱȱ ȱ ȱȱ£ûǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ûȱ ȱȱȱȬǽǾǽǾȱûǯȱȱ ȱ if (isDOPI && k - a[i][j] < cost) { i0 = i; j0 = j; cost = k - a[i][j]; } ȱ ȱ ȱ ãȱ ȱ ȱ £ȱ ȱ ǰȱ ȱ ȱ ȱȱȱǯȱȱȱ¡ȱȱȱȱ¡ǰȱȱ ȱ ȱȱȬ ȱǽ¡ƸŗǾȱǰȱûȱ ȱȱȱȱǰȱȱȱȱȱȱȱȱ ǻȱǽŖǾȱȱǽ¡ǾǼDZȱ ȱ boolean found = false; for (int tmpIdx = 0; tmpIdx 1->10->5->50->504->252->2524 564 4->44->22->224->112->56->564 12 4->2->24->12 3 4->2->24->12->6->3 ǻȱȱȱ ȱ£ȱ ǰȱDZȱǯ ǯȱǼȱ ȱ
Problemanalyse und Entwurf der Lösung ȱ ȱȱȱ£ȱȱȱȱǰȱȱ ȱȱȱȱȱȱ £ȱŚȱǯȱ£ȱ ȱ ȱȱȱȱȱȱDZȱ ȱ ′ǼȱȱȱȱȱŚǰȱ ȱȱȱȱDzȱ ′ǼȱȱȱȱȱŖǰȱ ȱȱȱȱDzȱ ′Ǽȱȱ£ȱȱȱȱŘǯȱ ȱ ǰȱȱȱȱȱûȱȱȱȱȱȱ£ȱȱȱŚȱ ȱǯȱȱãȱȱȱȱ£ȱȱ£ȱȱûȱȱ Ȭ ȱȱ ȱûǯȱȱûȱȱǰȱ ȱȱ£ǰȱȱȱȱȬ ȱȱ ≥ȱŚȱȱȱȱȱȱǯȱȱȱȱǰȱȱȱ ȱȱȱȱȱŘȱȱȱȱȱǯȱȱ£ȱȱ ȱȱȱȱûȱȱ DZȱȱ ȱ Ǽ ŗŖȱ→ȱDzȱȱ Ǽ ŗŖȱƸȱŘȱ→ȱŘŖȱƸȱŚȱ→ȱŘDzȱ Ǽ ŗŖȱƸȱŚȱ→ȱȱ→ȱŘDzȱ Ǽ ŗŖȱƸȱŜȱ→ȱŘŖȱƸȱŗŖȱƸȱŘȱ→ȱŚŖȱƸȱŘŖȱƸȱŚȱ→ȱŚȱƸȱŘDzȱ Ǽ ŗŖȱƸȱŞȱ→ȱŘŖȱƸȱŗŖȱƸȱŜȱ→ȱŚŖȱƸȱřŖȱƸȱŘȱ→ȱŞŖȱƸȱŜŖȱƸȱŚȱ→ȱŞȱƸȱŜǯȱ÷ȱȱ ȱ ûȱȱ ȱȱȱȱǻǼǯȱȱ ȱ
110
Grundlegende Algorithmen mit Java
Programm import java.io.*; import java.util.*; public class P02Number4 { private static final String FileInputName = "nr4.in"; private static final String FileOutputName = "nr4.out"; private static StringBuilder numberFour(int number, StringBuilder out) { if (number != 4) { switch (number % 10) { case 0: case 4: numberFour(number / 10, out); break; default: numberFour(number * 2, out); } out.append("->"); } out.append(number); return out; } public static void main(String[] args) throws IOException { Scanner sc = null; PrintStream out = null; try { out = new PrintStream(new File(FileOutputName)); sc = new Scanner(new File(FileInputName)); while (sc.hasNextInt()) { int number = sc.nextInt(); out.println(numberFour(number, new StringBuilder())); } } finally { if (sc != null) { sc.close(); } if (out != null) { out.close(); } } } }
5
Rekursion
111
Aufgaben ŗǯ Řǯ
ȱȱȱȱûȱȱȱȱŚǯȱȱǯȱ ȱȱȱȱȱȱûǯȱ
Problem 3. Rest großer Potenzen ȱȱȱȱ R = B P mod M ǰȱ ȱǰȱȱȱȱûȱȱǰȱȱ Ŗȱ≤ȱǰȱȱ≤ȱŘŖŖǯŖŖŖǯŖŖŖȱȱŖȱ ≤ȱȱ≤ȱśŖǯŖŖŖǯȱDZȱȱȱȱǯȱȱȱ ȱ §ȱ ȱ ǰȱ ȱ ȱ ȱ ǯȱ DZȱ ȱ ȱ ȱ ǯȱȱȱûȱȱȱǻǰȱǰȱǼȱȱȱ R = B mod M ǯȱȱDZȱ p
bigmod.in 3 18132 17 17 1765 3 2374859 3029382 36123
bigmod.out 13 2 13195
ǻDZȦȦǯǯȦȦřȦřŝŚǯǼȱ
Problemanalyse und Entwurf der Lösung ȱȱȱȱ§ȱ£ȱǰȱȱ ȱȱ ȱȱȱȱ ȱǯǯȱȱ ȱȱȱ ãȱȱȱ ȱ ȱ £ȱ ǯȱ ȱ ȱ ǻǼȱ ȱ £ ȱ ȬȱȱȱȮŗǰȱŖȱȱŗȱ£ûǯȱȱȱȱȱȱ ȱȱȱȱ ¢ȱDZȱȱ ȱ ǻȱǼȱȱȱ ȱ ȱ ãđȱ ȱ ȱ ȱ ǻǼȱȱǻǼȱ£ûȱ ǻȱ¡ǰȱȱǼȱȱȱ ȱ ȱ Ȭ£ȱ £ûǰȱ ȱ ȱ this exp mod m ȱ ǻȱ¢Ǽȱȱȱ ȱ ȱ £ûǰȱ ȱ Ȭȱ ȱȱȱȱǰȱ ȱȱȱ ££ȱȱȱ ȱ ȱ£ȱȱȱ ȱȱȱǯȱȱȱȱȱ§ȱȱtȱȱ ȱȱ ǻǼȱȱȱȱȱ ǯȱ £ǯȱûȱȱǰȱǰȱȱ∈ȱW{0},ȱȱǻȉǼȱȱƽȱǻǻȱȱǼȉǻȱȱǼǼȱȱǯȱȱ ȱ ŗǯȱ ¡ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¡ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱ£ ȱŖȱȱȬŗǰȱûȱȱȱ¡ȱȬȱ¡ȱȱȱȱȱȱǯȱȱȱ ȱ£ȱ£ǰȱȱ a ⋅ b − (a%c) ⋅ (b%c) ȱȱȱǯȱȱȱȱ ȱ µȱȮȱǻȱȱǼµǻȱȱǼȱƽȱµȱȮȱµȱǻȱȱǼȱƸȱµȱǻȱȱǼȱȮȱǻȱȱǼµǻȱȱǼȱƽȱȱ
112
Grundlegende Algorithmen mit Java
ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱƽȱȱµȱǻȮȱǻȱȱǼǼȱƸȱǻȱȱǼȱµȱǻȮǻȱȱȱǼǼȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱ ȱ ȱȱȱȱȱȱȱ. ÷ ȱŘǯȱ §đȱȱ′ȱ£ȱȱ ȱ£DZȱ
∃R ∈ {0,..., c − 1} so dass a ⋅ b = Q ⋅ c + R → R = (a ⋅ b)%c = a ⋅ b − Q ⋅ c ∃R1 ∈ {0,..., c − 1} s.d. a = Q1 ⋅ c + R1 , R1 = a mod c ∃R2 ∈ {0,..., c − 1} s.d. b = Q2 ⋅ c + R2 , R2 = b mod c
ǻŗǼȱ
(2)
a ⋅ b = Q3 ⋅ c + R1 ⋅ R2
(a ⋅ b) mod c = ( R1 ⋅ R2 ) mod c = ( a mod c ⋅ b mod c) mod c . ÷
ȱ ȱ ȱȱȱȱǻǼȱǰȱȱȱȱ£ȱDZȱ ȱ
a ) 1, wenn P = 0 °b) 0, wenn nicht a) gilt und B = 0 ° °c) B%M , wenn nicht a) oder b) gilt und ( B = 0 oder P = 1) °° bigMod ( B, P, M ) = ®d) (BigMod(B, P/ 2,M)2 )%M , wenn nicht a), b) oder c) ȱ ° gilt und P gerade ist ° °e) (BigMod(B, P-1, M) ⋅ (B % M))%M , wenn nicht ° ¯° a), b), c) oder d) gilt und P ungerade ist
Programm import java.io.*; import java.util.*; public class P03BigMod { private static final String FileInputName = "bigmod.in"; private static final String FileOutputName = "bigmod.out"; private static long bigMod(long b, long p, long m) { if (0 == p) return 1; if (0 == b) return 0; if (1 == b || 1 == p) return b % m;
5
Rekursion
113
if (1 == m) return 0; if (0 == p % 2) { long aux; aux = bigMod(b, p / 2, m); return (aux * aux) % m; } else return (bigMod(b, p - 1, m) * (b % m)) % m; } public static void main(String[] args) throws IOException { Scanner sc = null; PrintStream out = null; try { out = new PrintStream(new File(FileOutputName)); sc = new Scanner(new File(FileInputName)); while (sc.hasNextLong()) { long b = sc.nextLong(); long p = sc.nextLong(); long m = sc.nextLong(); out.println(bigMod(b, p, m)); } } finally { if (sc != null) { sc.close(); } if (out != null) { out.close(); } } } } ȱ
Aufgaben ŗǯ Řǯ řǯ
Śǯ śǯ
ȱȱȱȱȱûȱȱǯȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ DZȱ ȱ ȱ ȱ ƽȱ ȱ Ȯȱ ǻȱ ȱǼǰȱǻǻȱȱǼȉǻȱȱǼǼȱȱȱƽȱǻǻȬǻȱȱǼǼµǻȬǻȱȱǼǼǼȱƽȱǯǯǯȱ ȱȱȱȱȱ Ȭ ȱǻDZȦȦǯǯȦȦŜȦȦȦǼȱȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ
ȱȱȱ ǯȱ ãȱȱȱȱȱȱ ȱȱȱȱȱ ǻǼǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ǰȱ ȱ Ƿȱ ǻȱ §Ǽȱûȱȱđȱȱȱ£ȱǯȱDZȱǷȱƽȱŗµŘµdzµǯȱȱ
114
Grundlegende Algorithmen mit Java Ŝǯ
ȱȱȱûȱȱŗǰȱŘǰȱdzǰȱǰȱȱȱȱŘǯŖŖŖǯŖŖŖǰȱȱȱ ȱȱǀśŖǯŖŖŖǯȱȱȱȱǰȱȱȱȱǻŗ⋅Ř⋅ǯǯǯ⋅Ǽȱ
ŝǯ
Şǯ
ȱ ȱ ǯȱ ȱ ȱ £ ȱ ǰȱ ȱ ȱ ȱ ȱ
ȱǯǯȱȱȱȱȱ ǯȱ ȱ ȱǰȱȱȱȱȱǯǰȱȱȱãǰȱ ȱȱ £ȱ£ȱǯȱȱȱȱȱȱ Ȭ Ȭ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ
ȱ ȱ ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ Ȭ ȱȱ ȱ ǯȱ tan
π
4
= 1 ȱȱ π = 4 ⋅ arctan 1 ȱ
ȱ
ȱ
ȱȱȱ
ȱ
ȱȱǻřǼȱ
ȱ ȱ ȱ ¢ȱ ǻŗŜřŞȬŗŜŝśǼȱ ȱ ȱ ȱ £ȱ ǻŗŜŚŜȬŗŝŗŜǼȱȱǯȱŗŜŝŖȱ§ȱȱȱȱȱ ȱûȱȱDZȱ
arctan x = x −
x3 x 5 x 7 + − + ..., ûȱȱ¡ȱz[ȱȱ¡≤ȱŗȱȱ 3 5 7
ȱȱȱȱȱȱȱȱȱȱȱȱȱǻŚǼȱ
ȱȱȱȱȱ DZȱ ȱ
arctan x = ȱ
§ x 2 n +1 · ¸, ȱûȱȱ¡ȱz[ȱȱ¡≤ȱŗȱ (−1) n ¨¨ ¸ n=0 © 2n + 1 ¹ ∞
¦
ȱ
ȱ
ǻśǼȱ
ȱ
ȱ ȱ Gottfried Wilhelm Leibniz (1646-1716) James Gregory (1638-1675) ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ π = 4 ⋅ arctan 1 ȱǰȱȱ ȱȱ DZȱ
5
Rekursion
115
≅ȱπȱ 0 4 1 2.666666666666667 2 3.4666666666666668 3 2.8952380952380956 4 3.3396825396825403 5 2.9760461760461765 100000 3.1416026534897203 100001 3.1415826537897158 200000 3.1415976535647618 200001 3.1415876536397613 300000 3.1415959869120198 300001 3.1415893202786864 400000 3.1415951535834941 400001 3.1415901536022441 ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻȱ ȱȱǁȱ πǼǰȱ ȱȱȱȱȱ ȱȱ ȱ ǻȱ ȱ ȱ ǀȱ πǼǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯǯȱ ȱ £ȱ πȱ ȱ ŗŖŖȱ ȱ ¡ȱǯȱȱ ȱȱȱǯȱȱ ȱŗŝŖŜȱȱȱȱȬ ȱ ȱ ȱ ǻŗŜŞŖȬŗŝśŗǼȱ ȱ ȱ ǰȱ ȱ πȱ ȱ ǯȱȱȱȱȱȱπȱȱŗŖŖȱȱȱDZȱ ȱ
şǯ
π
1 1 = 4 arctan − arctan 4 5 239
(6)
ȱȱȱǰȱȱπȱȱŗŖŖŖȱȱȱȱǻŜǼǰȱǻŚǼȱȱȱ
ȱȱǯȱ
Problem 4. Die Torte (lineare Rekursion) ȱ ȱ ¢ȱ ȱ ȱ ûȱ ȱ ȱ ȱ ǰȱ ȱ ȱ đȱ ȱ ûǯȱ ȱ 1 ȱ ȱ ãȱ ȱ ŝȱ ûȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ûȱ ȱ 6 2 ȱ¡ȱȱȱȱǵȱǻȱȱ 7 ȱȱȱȱȱȱ¡ȱ£ǰȱ ȱȱȱ ȱȱǵǼȱDZȱȱȱ 5 3 ȱ ǯȱ ȱ £ ȱ ȱ £ȱ ȱ Ȭ 4 ȱȱǻŖȱ ≤ȱȱ ≤ȱŘǯŖŖŖǼǯȱDZȱȱȱ ȱ ǯȱ ȱ ¡ȱ £ȱ ȱ ûǰȱ ȱȱ ȱȱȱȱȱȱǯȱDZȱ
116
Grundlegende Algorithmen mit Java torte.in
0 1 2 9 10 2000 678 ȱ
0 1 2 9 10 2000 678
Schnitte Schnitte Schnitte Schnitte Schnitte Schnitte Schnitte
torte.out -> 1 -> 2 -> 4 -> 46 -> 56 -> 2001001 -> 230182
Stuecke! Stuecke! Stuecke! Stuecke! Stuecke! Stuecke! Stuecke!
Problemanalyse und Entwurf der Lösung ȱȱ¡ȱ£ȱȱ ȱûȱȬŗȱȱȱ ȱǻȬŗǼȱǰȱ ȱȱȱȱȱ ȱȱ ȱ£DZȱ ȱ ǻŖǼȱȱƽȱŗȱȱȱǻȱȱ→ȱȱȱȱûDZȱȱ£ȱǼȱ ǻǼȱƽȱȱƸȱǻȬŗǼȱǰȱûȱȱǁŖȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǻŗǼȱ ȱ ȱȱǻŗǼȱȱȱȱǰȱȱ ȱȱȱȱȱ ǻǼǯȱȱ ȱ
Programm 4.1. import java.io.*; import java.util.*; public class P4Tart1 { private static final String FileInputName = "torte.in"; private static final String FileOutputName = "torte.out"; private static int S(int n){ if(n0){ transfBase10ToP(n/p, p, out); out.print(n%p) ; } } public static void main(String[] args) throws IOException { Scanner sc = null; PrintStream out= null;
122
Grundlegende Algorithmen mit Java try { out = new PrintStream(new File(FileOutputName)); sc = new Scanner(new File(FileInputName )); while(sc.hasNextLong()) { long n = sc.nextLong(); int p = sc.nextInt(); out.printf("%10d zur Basis %d = ", n, p); transfBase10ToP(n, p, out); out.println(); } } finally { if (sc!=null) { sc.close(); } if(out!=null) { out.close(); } }
} }ȱ ȱ
Aufgaben ŗǯ Řǯ řǯ Śǯ
ȱȱȱȬȱǰȱȱȱȱãǯȱ ȱȱȱȱ Ȭȱûȱȱȱȱȱȱ ȱǯȱ ȱȱȱǰȱȱȱȱȱ£ǯȱ ȱ ȱ ȱ §ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻǼȱȱȱȬ ȱȱãǯȱ ȱȱȱȱǻȱȱȱǼȱûȱȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ǻǰȱ Ǽǰȱ ȱ ȱ ȱȱȱȱȱȱ¢ȱȱȱȱȱȱȱ££ȱ ǯȱDZȱ
ȱ baseP10.in 42252100 8 11 2 12 6 ȱ
baseP10.out 9000000 3 8ȱ
ȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¡ȱ ȱ ȱȱȱǻǼȱȱȱ ȱǯȱ
5
Rekursion
123
Problem 7. Summe zweier Wurzeln (verzweigte Rekursion) − Sx + P = 0 ȱȱǰȱȱ ∈ȱ[ȱǯȱ¡ŗȱȱ¡ŘȱȱȱȬ n n £ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ Tn = x1 + x2 für n ∈ Wȱ ǯȱ ȱ
ȱȱȱ ȱ x
2
ȱǰȱȱȱ£ȱ¡ŗȱȱ¡Řȱ£ȱǯȱȱȱȱǰȱȱȱȬ śŖŖȱ≤ȱȱǰȱȱ≤ȱśŖŖȱȱȱûȱȱȱǻŖȱ≤ȱȱ≤ȱŘŖǼȱȱȱȱǰȱȱȱ ȱǯȱDZȱ ȱ equation.in equation.out 5 6.54 3.22 7799.79 0 3 4 2 1 3.45 6.78 3.45 ȱ
Problemanalyse und Entwurf der Lösung ȱ ¡ŗȱ ȱ ¡Řȱ ȱ £ȱ ȱ ȱ ǰȱ x 2 − Sx + P = ( x − x1 )( x − x2 ) ǯȱ ȱȱ x1 + x2 = S ȱ x1 ⋅ x2 = P ȱǻȱȬǼǯȱȱȱûȱȱȱDZȱ ȱ
2, wenn n = 0 ° ȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱ Tn = ® x1 + x2 , wenn n = 1 °ST − PT , wenn n > 1 n−2 ¯ n−1
ȱ
ȱ
ǻŗǼȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ¡ȱ ãȬ ǰȱȱ¢ȱȱ£ǯȱȱ¡ȱȱȱ ȱśȱȱ ȱ §ȱ ȱ ȱ Ȭȱ ȱ ȱ ȱ ƸƸǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¢ȱ ȱ ȱ ǰȱ ȱ ȬȦ ȱ ȱ ȱ ǯǯȱȱǯǯȱȱ§ȱȱǻȱ§£ǼȱȬ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ Ȭ ȱȱȬȱ£ȱȱȱȱǻǼȱȱ ǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P7Equation { private static final String FileInputName = "equation.in"; private static final String FileOutputName = "equation.out"; private static double sum(int n, double s, double p){ if(0==n) return 2; if(1==n) return s;
124
Grundlegende Algorithmen mit Java return s*sum(n-1, s, p)-p*sum(n-2, s, p);
} public static void main(String[] args) throws IOException { Scanner sc = null; PrintStream out= null; try { out = new PrintStream(new File(FileOutputName)); sc = new Scanner( new File(FileInputName)).useLocale(Locale.ENGLISH); Formatter formatter = new Formatter(out, Locale.ENGLISH); while(sc.hasNextInt()) { int n = sc.nextInt(); double s = sc.nextDouble(); double p = sc.nextDouble(); formatter.format("%.6g%n", sum(n, s, p)); } } finally { if (sc!=null) { sc.close(); } if(out!=null) { out.close(); } } } }ȱ ȱ
Aufgaben ŗǯ Řǯ řǯ
ȱȱȱȱǻŗǼȱȱȱȱ§ȱǯȱ ȱȱȱȱȱ Ȯ ȱǻDZȦȦǯǯȦȦŜȦȦǼȱȱȬ ȱȱȱȱȱȱ ȱȱǯȱ ǯȱ ȱ ȱ ûȱ ȱ ȱ Ȭȱ ȱ
x k − S1 x k −1 + ... + (−1) k S k = 0 ȱ ȱ ȱ £ȱ ¡ŗǰȱ ¡Řǰȱ dzǰȱ ¡ȱ ȱ ȱ Tn = x1n + x2n + ... + xkn ǯȱȱ ȱ
DZȱȱȱȱȱȱ
Tn = S1Tn−1 − S 2Tn−2 + ... + (−1) k −1 ⋅ S k ⋅ Tn−k ǯȱ ȱ
5
Rekursion
125
Problem 8. Collatz-Funktion (nicht-monotone Rekursion) ȱ£Ȭȱȱȱ ȱDZȱ ȱ
1, wenn n = 1 °n ° ȱ f (n) = ® , wenn n gerade °2 °¯3 ⋅ n + 1, wenn n ungerade ȱȱȱǰȱȱȱȱŗȱǮȃǯȱȱȱ ȱûȱƽŗŘȱ ȱȱ£DZȱŗŘǰȱŜǰȱřǰȱŗŖǰȱśǰȱŗŜǰȱŞǰȱŚǰȱŘǰȱŗȱȱȱȱȱȱ§ȱşǰȱ ȱȱȱ şȱȱȱȱǯȱȱȱȱȱǰȱȱȱ£ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ ǯȱ Ȭ DZȱ ȱ collatzSeq.in collatzSeq.out 1 1 12 12 6 3 10 5 16 8 4 2 1 67 1003 67 202 101 304 152 76 38 19 58 29 88 44 22 11 234 34 17 52 26 13 40 20 10 5 16 8 4 2 1 1003 3010 1505 4516 2258 1129 3388 1694 847 2542 1271 3814 1907 5722 2861 8584 4292 2146 1073 3220 1610 805 2416 1208 604 302 151 454 227 682 341 1024 512 256 128 64 32 16 8 4 2 1 234 117 352 176 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 ȱ
Problemanalyse und Entwurf der Lösung ȱ ȱȱȱȱ£ǻǼȱǰȱȱȱȱȬ ȱȱȱȱ£ȱȱȱ£§ǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P08CollatzSeq { private static final String FileInputName = "collatzSeq.in";
126
Grundlegende Algorithmen mit Java
private static final String FileOutputName = "collatzSeq.out"; private int step; private PrintStream out; public P08CollatzSeq(PrintStream outStream) { this.step = 0; this.out = outStream; } public void calculate(long n) { this.out.print(n); this.out.print(' '); if (n != 1) { this.step++; this.calculate(n%2 == 0 ? n/2 : 3*n+1); } else { out.print(" ", yaux, n); ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ǽǾǽȬŗǾȱ ȱ §ȱ ȱ ǽǾǽǾȱ ȱ ǻǽǾǽǾȱ ƽȱ ǽǾǽȬŗǾƸŗǼȱ ȱ ǽȬŗǾǽǾȱ ȱ §ȱ ȱ ǽǾǽǾȱ ȱ ǻǽǾǽǾȱ ƽȱ ǽȬŗǾǽǾƸŗǼDZȱ ûȱ ûǰȱ ǻǼȱ ȱ ȱ Ȭ ȱ ǰȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ǰȱ ȱ ȱ ȱȱȱȱȱȱȱ¡ȱŖȱǰȱȱ ȱȱ ȱ £ǯȱ ǯȱ ǻǻ¡ǯǻȬŗǼƽƽ¢ǯǻȬŗǼdzǼȱ ȱ ¡ǯǻǼƽƽ¢ǯǻǼǯȱ Ȭ ȱȱȱȱȱȱǻǰȱǰȱǰȱǼǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P13EditDistance { private static final String FileInputName = "edit.in"; private static final String FileOutputName = "edit.out"; private int T[][]; private StringBuilder x, y; P13EditDistance(StringBuilder x, StringBuilder y) { this.x = x; this.y = y;
302
Grundlegende Algorithmen mit Java
this.T = new int[y.length() + 1][x.length() + 1]; } private int getEditDistance() { int m = x.length(); int n = y.length(); if (m == 0) return n; if (n == 0) return m; for (int i = 0; i 0) { if (x.charAt(m - 1) == y.charAt(n - 1)) { if (T[n - 1][m - 1] == T[n][m]) { flag = true; writeSolution(out, m - 1, n - 1, yaux); } } else { if (T[n - 1][m - 1] + 1 == T[n][m]) { flag = true; yaux.replace(n-1, n, x.substring(m-1, m)); writeSolution(out, m - 1, n - 1, new StringBuilder(yaux)); out.printf("%s T(%d) --> ", yaux, n); } }
8 Dynamische Programmierung
303
} if (n > 0 && !flag) { if (T[n][m] == T[n - 1][m] + 1) { flag = true; yaux.delete(n-1, n); writeSolution(out, m, n - 1, new StringBuilder(yaux)); out.printf("%s I(%d) --> ", yaux, n); } } if (m > 0 && !flag) { if (T[n][m] == T[n][m - 1] + 1) { yaux.insert(n, x.charAt(m-1)); writeSolution(out, m - 1, n, new StringBuilder(yaux)); out.printf("%s D(%d) --> ", yaux, n + 1); } } } } void writeSolution(PrintStream out) { out.printf("d(%s, %s) = %d%n", this.x, this.y, this.getEditDistance()); writeSolution(out, x.length(), y.length(), new StringBuilder(this.y)); out.println(this.y); out.println("========================"); } public static void main(String[] args) throws IOException { Scanner scanner = null; PrintStream out = null; try { scanner = new Scanner(new File(FileInputName)); out = new PrintStream(new File(FileOutputName)); while (scanner.hasNext()) { StringBuilder x = new StringBuilder(scanner.next()); if (!scanner.hasNext()) break; StringBuilder y = new StringBuilder(scanner.next()); new P13EditDistance(x, y).writeSolution(out); } } finally { if (scanner != null) { scanner.close();
304
Grundlegende Algorithmen mit Java } if (out != null) { out.close(); } }
} } ȱ
Aufgaben ŗǯ
Řǯ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǯǯȱ ȱ ȱ ȬȬȱ ǯȱ £ȱ ȱ ȱ
ȱ ǯǯȱ ûȱ ȱ ȱ ȱ ¢ȱ Ȭ ȱ ȱ ȱ ȱ ǯǯǰȱ ȱ ȱ ȱ ȱ ¢ȱ ȱ¢ȱǽǾȱ ȱǻȱ ȱȱȱ¢ǻǼǼǯȱ ȱ ȱ ǰȱ ȱ ȱ ȱ DZȱ ûȱ ȱ £ȱ ǰȱ ûȱ ȱãȱǰȱûȱȱûȱǯȱȱ ȱȱȱȱǻǰȱȱȱȱǼȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ Ȭ ȱǰȱȱȱ ȱȱ ǯȱDZȱ
ȱ edit1.in probleme loesungen 4 2 1 baerchen zwerglein 5 3 1 boese gute 2 3 1
ȱ řǯ
edit1.out d(probleme, loesungen) = 17 probleme D(1) --> robleme D(1) --> obleme D(1) --> bleme D(1) --> leme I(2) --> loeme D(4) --> loee I(4) --> loese I(5) --> loesue I(6) --> loesune I(7) --> loesunge I(9) --> loesungen ======================== d(baerchen, zwerglein) = 19 baerchen D(1) --> aerchen D(1) --> erchen I(1) --> zerchen I(2) --> zwerchen D(5) --> zwerhen D(5) --> zweren I(5) --> zwergen I(6) --> zwerglen I(8) --> zwerglein ======================== d(boese, gute) = 7 boese D(1) --> oese T(1) --> gese T(2) --> guse T(3) --> gute ========================
ȱ ȱ ȱ λȱ ȱ ȱ ǯȱ ȱ ãȱ ȱ ȱ ȬȬ
ȬȱȱȱȱȱDZȱ ǻλǰλǼȱƽȱŖȱ ǻ¡ŗ¡Řdz¡ǰȱλǼȱƽȱȱȱûȱȱȱ≥ŗȱ ǻλǰȱ¢ŗ¢Řdz¢Ǽȱƽȱȱȱûȱȱȱ≥ŗȱ ȱ
8 Dynamische Programmierung
305
°max{m, n}, wenn es keine gemeinsamen Buchstaben gibt ° d ( x1 x2 ...xm , y1 y 2 ... y n ) = ®min ( d ( x1 ..xi −1 , y1 .. y j −1 ) + d ( xi +1 ..xm , y j +1 .. y n )), ȱ ° xi = y j °¯ wenn es mindestens einen gemeinsamen Buchstaben gibt
Śǯ
ȱ ȱȱȱȱûǯȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǯȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȬȬȱ ȱ Ȭ ȱȱȱȱȱȱȱ ȱǯȱȱȱȱ ǰȱȱȱȱȱ ǰȱ£ǯȱǯȱDZȱȱ Ȭ ǰȱȱûȱ¡ȱǻǻǼǰȱǻǼǰȱǻǼǼǰȱ§Ȭ ȱȱȱǻǻǼǼǰȱȱȱȱǻǻǼǰȱȬ ǻǼǰȱ ǻǼǰȱ ǻǼǰȱ ǻǼǼǰȱ ȱ ȱ Ȭ ȱ ǻ¡ǻǼǰȱ ¡ǻǼǼǰȱ £ȱ ȱ ȱ ǻ ǻǼǰȱ ǻǼǰȱǻǼǼǰȱ ȱǻǻǼǼǯȱ
Problem 14. Arbitrage ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ǰȱ ȱ ȱȱȱȱ§ȱ ȱ£ȱ£ǯȱȱȬ ȱ ȱ ȱ ȱ §ǯȱ ȱ ȱ £ȱ ȱ ȱ ȱ Ȭȱ Ŗǰśŗȱ ȱȱȱãǰȱȱȱȱȱŗǰŚŞȱȱȱȱȱ ȱ ŗǰřŜȱ Ȭǰȱ ȱ ȱ ȱ ȱ ȱ ŗǰŖŘŜśŘŞȱ ȱ ȱ ȱ ŘǰŜȱ £ȱ ǯȱȱ ȱ ŗǞȱȘȱŖǰśŗǡȦǞȱȘȱŗǰŚŞǧȦǡȱȘȱŗǰřŜǧȦǞȱƽȱŗǰŖŘŜśŘŞǞȱ ȱ ȱȱȱȱ¡ȱûȱ£ȱǰȱȱ ȱȱđȱǯȱ ȱȱȱǰȱȱǰȱȱȱȱȱȱȱ ȱ Ȭȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǰȱ ȱ ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ §ȱ ȱȱȱǻȱ ǰȱȱȱǼǯȱȱDZȱȱȱȱȬ ǯȱ ãȱ ȱ ȱ §ȱ ǯȱ ȱ ȱ ȱ ȱ Ȭ ȱ Ȭȱ ǰȱ ȱ ȱ £ȱ ȱ §ȱ ǰȱ ȱ ȱ ȱ ȱǰȱȱȱȱŘ≤≤ŘŖǯȱȱȱȱȱȱȱȱ ȱȱ§Ȭ ȱ£ǰȱȱȱȱȱȱȱȱǯȱȱȱȱȱȱ ȱȱȱȱȱȱ§ȱŗȱ £ȱȱȱ Ȭŗȱ§Ȭ ȱ ǻ£ȱ §ȱ Řǰȱ řǰȱ dzǰȱ Ǽǰȱ ȱ £ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ§ȱŘȱ£ȱȱȱ§ȱǻ£ȱ§ȱŗǰȱřǰȱŚǰȱdzǰȱǼȱ ǯȱDZȱ
306
Grundlegende Algorithmen mit Java
ȱ ȱ ûȱ ȱ ȱ ûǰȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ £ȱ ȱ ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ §ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ £ǯȱ ȱ ȱŘȱȬǁȱŗȱȬǁȱŘȱ£ȱȱ§ȱ£ ȱȱǻȱ§ȱŘȱȱ ȱ§ȱŗȱǰȱȱȱ ȱ§ȱŘǼǯȱȱȱȱ ǯȱ ȱȱȱȱ£ȱǻȱŗDZǼǰȱȱȱȱȱȬȱȱ §Ȭ ȱ ȱ ǻȱ ŘǼǰȱ ȱ ȱ ȱ ȱ đȱ ȱ ȱ ȱ Ȭ £ǯȱȱȱ ȱȱȱȱȱȱȱ ȱǰȱȱȱȱ ȱȱ§ȱ ǯȱȱȱȱȱǰȱ ȱȱȱȱȱ Ȭ ȱǮȱȱȱǷȃȱǯȱ arbitrage.in 3 1.2 .89 .88 5.1 1.1 0.15 4 3.1 0.0023 0.35 0.21 0.00353 8.13 200 180.559 10.339 2.11 0.089 0.06111 2 2.0 0.45
arbitrage.out Fall 1: Waehrung 2 2 -> 1 -> 2 1.056 Fall 2: Waehrung 3 3 -> 1 -> 2 -> 3 2.189 Fall 3: Es gibt keine Loesung!
ǻǰȱȱȱǰȱŘŖŖŖǰȱ£Ǽȱ ȱ
Problemanalyse und Entwurf der Lösung ȱ£ ȱ¢ȱǽǾǽǾȱȱȱȱȱȱȱȱ ȱǰȱȱȱȱǮȃȱ ȱ ǯȱȱȱȱȬ ȱ ǰȱ ȱ ȱ ûȱ ȱ ȱ ȱ §ȱ ȱ ȱ ȱ ȱ ȱ §ȱ ȱ §ǯȱûȱȱȱ ȱȱûûǰȱȱûȱȱȱȱȱû£ǯȱ ûȱ ȱ §ȱ ȱ ȱ ȱ ȱ ǽǾǽǾȱ ȱ ŗǯȱ ȱ ǽǾǽǾȱ ȱ ȱȱ£ȱȬȱǯȱȱ
8 Dynamische Programmierung
307
ȱ ȏ ȏ ǻǼȱ ȱ ȱȱȱ¡ȱǽǾǽǾȱȱȱ¢ȱȱ ȱ ȱȱȱǻƜŗǰȱDzȱȱŗǼȱ¡ȱ ȱ ȱȱȱȱȱǻƜŗǰȱDzȱȱŗǰȱƾǼȱ¡ȱ ȱ ȱȱȱȱȱȱȱǻƜŗǰȱDzȱȱŗǰȱƾǼȱ¡ȱ ȱ ȱȱȱȱȱȱȱȱȱǻǽǾǽǾȘǽǾǽǾȱǁȱǽǾǽǾǼȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱǽǾǽǾȱƜǽǾǽǾȘǽǾǽǾȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱǽǾǽǾȱƜǽǾǽǾȱ ȱ ȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱȱȱȱȏȱ ȱ ȱȱȱȱȏȱ ȱ ȱȱȏȱ ȱ ȱȱȱǽǾǽǾȱ ȱ ȏ ȏȱ ȏ ǻǼȱ ȱ ȱ ȱȱȱȱ − ȱ ǻǼDZȱ ȱ ȱ Ȭǰȱ ȱ ȱ ȱ ȱ ȱ ǻǼȱ ȱȱ£ȱȱ§ȱȱȱȱȱ£ǰȱȱȱȬȱȱ §ǯȱȱ ȱȱȱȱȱȱ ≥ȱŗǯŖŗȱǰȱȱȱȱ ȱûȱãǰȱȱ ȱǯȱȱȱȱȱǰȱȱ ȱãȱûDzȱ − ȱ ǻǼDZȱ ȱ ǰȱ ȱ ȱ ȱ ȱ §ȱ ǯȱ ȱ ȱ ȱ ȱ ¡ȱ ǽǾǽǾǰȱ ȱ ȱ ȱ £ûȱ £ȱ ǯȱ ȱ £ȱ ȱ ȱ ȱ ȱ £ ȱ ȱ §ȱ ǽǾǽǾȱ ȱ ȱ ȱ ȱ ȱǽǾǽǾȱȱȬŗǯȱȱȱǽǾǽǾȱȱȱȱ§ȱ ȱ ȱ ȱ ȱ ȱ ȱ ¡ȱ ȱ £ ȱ ȱ ȱ ȱ ǻȱ £ȱ ¡ ǰȱ ȱȱȱ§ȱȱȱȱ§ȱȱ Ǽǯȱ ȱ
Programm import java.io.*; import java.util.*; public class P14StocksFluctuation { private static final String FileInputName = "arbitrage.in"; private static final String FileOutputName = "arbitrage.out"; private static void recoverPath(PrintStream out, int pred[][], int i, int j) { int t = pred[i][j]; if (i != t) {
308
Grundlegende Algorithmen mit Java recoverPath(out, pred, i, t); out.print(" -> "); out.print(t + 1); }
} static boolean find(PrintStream out, int n, float table[][], int pred[][]) { int i, j, k; for (k = 0; k < n; k++) for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (table[i][k] * table[k][j] > table[i][j]) { pred[i][j] = pred[k][j]; table[i][j] = table[i][k] * table[k][j]; if (i == j && table[i][j] >= 1.01) { out.print(" Waehrung "); out.println(i + 1); out.print(' '); out.print(i + 1); recoverPath(out, pred, i, i); out.print(" -> "); out.println(i + 1); out.printf(Locale.ENGLISH, " %.3f%n", table[i][i]); return true; } } return false; } public static void main(String[] args) throws IOException { Scanner scanner = null; PrintStream out = null; try { scanner = new Scanner( new File(FileInputName)).useLocale(Locale.ENGLISH); out = new PrintStream(new File(FileOutputName)); int numCase = 0; while (scanner.hasNextInt()) { int n = scanner.nextInt(); float table[][] = new float[n][n]; int pred[][] = new int[n][n]; for (int i = 0; i < n; i++) { table[i][i] = 1.0f; for (int j = 0; j < n; j++) if (i != j) { table[i][j] = scanner.nextFloat();
8 Dynamische Programmierung
309
pred[i][j] = i; } pred[i][i] = -1; } out.printf("Fall %d: %n", ++numCase); if (!find(out, n, table, pred)) out.println(" Es gibt keine Loesung!"); } } finally { if (scanner != null) { scanner.close(); } if (out != null) { out.close(); } } } } ȱ
Aufgaben ŗǯ Řǯ řǯ
£ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ §ȱȱȱ ȱȱȱȱ£ȱǯȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ãđȱ ȱȱ ǯȱ ȱȱȱȱȱȱǻȱȱȱ£ǯȱǯȱȱȱȬ Ǽȱȱȱȱǰȱȱȱȱ ûȱȱ ȱȱȱ ȱǯȱȱȱȱȱȱȱ ȱȱȱ ȱȱȱûȱȱȱȱȱȱȬǯȱ
ȱ
ãȱȱ¢ȱ
ȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ ȱ ȱ
ȱ ȱȱǰȱȱ
ȱ ȱ ȱ
9
Potenzsummen ȱ ȱ
Problembeschreibung ȱȱȱûȱȱȱ≥ȱŖȱǯȱȱ£ȱûȱȱDZȱ ȱ
S k (n) = 1k + 2 k + 3k + ... + n k ǯȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ȱ
ǻŗǼȱ
ȱ ȱȱ ȱǻȱ§ȱȱȱȱǻŗřǼȱǼǰȱȱǻǼȱ ȱ¢ȱǻƸŗǼȬȱ ȱȱȱǰȱȱȱȱ £ȱǰȱǯǯȱȱȱ ǻǼȱȱDZȱ ȱ 1 ȱ ȱ ȱ ȱ ǻŘǼȱ S k ( n) = (ak +1n k +1 + a k n k + ... + a1n + a0 ) ǯȱ M ȱ ȱ ȱ Ƹŗǰȱ ǰȱ ǯǯǯǰȱ ŗǰȱ Ŗȱ ȱ £ȱ ǰȱ ȱ ȱ đȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻǰȱ Ƹŗǰȱ ǰȱ ǯǯǯǰȱ ŗǰȱ ŖǼȱ ûȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱûȱȱȱûȱȱǯȱ DZȱȱȱǯȱȱȱȱȱûȱȱǻŖȱ≤ȱȱȱ≤ȱŘŖǼǯȱ DZȱȱǯȱȱûȱȱȱȱȱȱȱȱǰȱƸŗǰȱǰȱǯǯǯǰȱŗǰȱŖȱ ȱ ǰȱ ȱȱȱȱȱǯȱDZȱ ȱ psum.in 2 5 0 16
psum.out 6 2 3 1 0 12 2 6 5 0 –1 0 0 1 1 0 510 30 255 680 0 -2380 0 8840 0 -24310 0 44200 0 -46988 0 23800 0 -3617 0
ȱȱȱȱȱȱȱǻȱȬȱȱȱȱǰȱŗşşŝȬşŞǼȱȱ
Problemanalyse. Algebraische Modellierung. ȱȱǻǼȱDZȱ
S 0 (n) =
n
¦i i =1
0
=n
ǻřǼȱ
312
Grundlegende Algorithmen mit Java n
S1 (n)
¦i = i =1
n(n + 1) 1 2 = ( n + n) ȱ 2 2
n
¦i
S2 (n) =
2
=
i =1
¦i
3
i =1
n
S 4 ( n) =
¦ i =1
i4 =
ȱ
n(n + 1)(2n + 1) 1 = ( 2n3 + 3n 2 + n) ȱȱ 6 6
n
S 3 ( n) =
ȱ
=
n 2 (n + 1) 2 1 4 = ( n + 2n 3 + n 2 ) ȱ 4 4
ȱ
ȱ
ȱ
ȱ
ǻŚǼȱ
ȱ
ȱ
ȱ
ȱ
ǻśǼȱ
ȱ
ȱ
ȱ
ȱ
ǻŜǼȱ
ȱ
ǻŝǼȱ
n(n + 1)(2n + 1)(3n 2 + 3n − 1) 1 = (6n5 + 15n 4 + 10n3 − n) ȱȱȱȱȱȱ ȱȱȱ 30 30
ȱ ȱ ȱ ȱ §ǯȱ ȱ ãȱ ȱ ȱ §ȱ ȱ ȱ ǯȱȱ ȱ£ȱśǻǼȱǯȱȱ ȱȱ ȂȱȬ ȱȱ DZȱ
§ 6· §6· §6· §6· § 6· (i − 1) 6 = i 6 − ¨¨ ¸¸i 5 + ¨¨ ¸¸i 4 − ¨¨ ¸¸i 3 + ¨¨ ¸¸i 2 − ¨¨ ¸¸i + 1 ©1 ¹ © 2¹ ©3¹ © 4¹ ©5¹
(8)
ȱ ȱȱ§ȱ£DZȱ
ȱ i 6 − (i − 1) 6 = 6i 5 − 15i 4 + 20i 3 − 15i 2 + 6i − 1
(9)
ȱȱȱŗȱȱȱ§ȱDZȱ ȱ n
n
¦ (i
6
¦i
− (i − 1) 6 ) = 6
i =1
i =1
n
5
¦i
− 15
i =1
n
4
¦i
+ 20
i =1
n
3
¦i
− 15
2
n
n
i =1
i =1
¦ i − ¦1 ,
+6
k =1
(10)
ȱ£ȱȱȱȱȱȱDZȱ
n 6 = 6 S 5 (n) − 15S 4 (n) + 20S 3 (n) − 15S 2 (n) + 6S1 (n) − S 0 (n)
(11)
ȱ ȱǻŗŗǼȱ ȱãȱ£DZȱ ȱ S 5 (n) =
n 2 (n + 1) 2 (2n 2 + 2n − 1) 1 = ( 2n 6 + 6n 5 + 5n 4 − n 2 ) 12 12
ȱȱȱȱȱûȱ£DZȱ
ȱ
(12)
9
Potenzsummen
313
(k + 1) S k (n) = § k + 1· § k + 1· § k + 1· § k + 1· ¸¸S k −1 (n) − ¨¨ ¸¸ S k −2 (n) + ... + (−1) p ¨¨ ¸¸ S k − p+1 (n) + ... + (−1) k ¨¨ ¸¸ S1 (n) + (−1) k +1 S 0 (n) n k +1 + ¨¨ 2 3 p © ¹ © ¹ © ¹ © k ¹
(13)
Von der Rekursionsgleichung zum Algorithmus ȱ ǻŗřǼȱ ǰȱ ȱ ȱ £ȱ ȱ ȱ ȱ ǻǰȱ Ƹŗǰȱ ǰȱ ǯǯǯǰȱ ŗǰȱ ŖǼȱ ûȱ ȱ ȱ ȱ ȱ ȱ £ȱ ãǰȱ ȱ ȱ ȱ £ȱ ȱ ǰȱ §ȱ Ŗǰȱ ŗǰȱ ǯǯǯǰȱ Ȭŗǰȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ ȱ £ȱ ȱ §ȱ ȱ ȱ £ȱ £ȱ ãǯȱȱ ȱȱ¢ȱǽǾȱ£ǰȱȱȱȱǽŖǾǰȱǽŗǾǰȱǽŘǾǰdzǰȱǽǾȱ ȱ ȱ ȱ DZȱ ǽǾȱ ȱ ȱ ûȱ ȱ ȱ ȱ ȱ ȱûȱǻǼǰȱŖȱ≤ȱȱ≤ȱǯȱ ȱ ȱ£ ȱ¢ȱǽǾǽǾȱȱ ȱȱȱȱǻƸŗǰȱǰȱǯǯǯǰȱŗǰȱ ŖǼȱûȱŖȱ ≤ȱȱ ≤ȱȱȱȱǰȱȱȱȱȱȱȱ £ȱ ûȱǻǼȱǯȱ ȱ ȱȱȱ¡ȱǽǾǽǾȱȱȱȱǽǾȱ ǽŖǾǽŖǾȱ ǽŖǾǽŗǾȱ ȱ ȱ ȱ ȱ ǽŖǾȱ ǽŗǾǽŖǾȱ ǽŗǾǽŗǾȱ ǽŗǾǽŘǾȱ ȱ ȱ ȱ ǽŗǾȱ ǽŘǾǽŖǾȱ ǽŘǾǽŗǾȱ ǽŘǾǽŘǾȱ ȱ ȱ ȱ ǽŘǾȱ ǯǯǯȱ ǯǯǯȱ ȱ ǯǯǯȱ ȱ ȱ ǯǯǯȱ ǽȬŗǾǽŖǾȱ ǽȬŗǾǽŗǾȱ ǽŗǾǽŘǾȱ ǯǯǯȱ ǽȬŗǾǽǾȱ ȱ ǽȬŗǾȱ ǽǾǽŖǾȱ ǽǾǽŗǾȱ ǽǾǽŘǾȱ ǯǯǯȱ ǽǾǽǾȱ ǽǾǽƸŗǾȱ ǽǾȱ
ȱ ȱȱȱȱȱǻŘǼȱDZȱ ȱ S k (n) =
(
)
1 A[k ][k + 1]n k +1 + A[k ][k ]n k + ... + A[k ][1]n + A[k ][0] ȱ M [k ]
ȱ
ȱ
ǻŗŚǼȱ
ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ȱ ȱ ǻǽǾǰȱ ǽǾǽƸŗǾǰȱ ǽǾǽǾǰȱ dzǰȱ ǽǾǽŗǾǰȱ ǽǾǽŖǾǼȱ ȱ ȱ ȱ ȱ ȱ ȱ ǻǽǾǰȱ ǽǾǽƸŗǾǰȱ ǽǾǽǾǰȱ dzǰȱ ǽǾǽŗǾǰȱǽǾǽŖǾǼȱûȱŖȱ ≤ȱȱǀȱȱǯȱȱȱȱȱȱȱ ȱǰȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ§ǯȱȱȱ£DZȱ
314
Grundlegende Algorithmen mit Java
( k + 1) S k (n) = n k +1 § k + 1· 1 k k −1 + ¨¨ ¸¸( M [k − 1] ( A[k − 1][k ]n + A[k − 1][k − 1]n + ... + A[k − 1][1]n + A[k − 1][0])) 2 © ¹ § k + 1· 1 ¸¸( (A[k − 2][k − 1]n k −1 + A[k − 2][k − 2]n k −2 + ... + A[k − 2][1]n + A[k − 2][0])) − ¨¨ © 3 ¹ M [k − 2]
ǻŗśǼ
+ ... + § k + 1· 1 ¸¸( ( −1) p ¨¨ ( A[k + 1 − p ][k + 2 − p ]n k + 2− p + ... + A[k + 1 − p ][1]n + A[k + 1 − p ][0])) © p ¹ M [k + 1 − p] + .. § k + 1· 1 ¸¸( ( −1) k ¨¨ ( A[1][2]n 2 + A[1][1]n + A[1][0])) + © k ¹ M [1] § k + 1· 1 ¸¸( ( −1) k +1 ¨¨ ( A[0][1]n + A[0][0])) © k + 1¹ M [0]
ȱ ȱȱȱȱȱȱȱŖǰȱŗǰȱǯǯǯǰȱȱȱȱȱȱǻŗřǼȱȱ¢ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ £ȱ ȱ ȱ ȱ ȱ ȱ ¢ȱȱ ȱǻƸŗǼDZȱ ȱ (k + 1) S k (n) = n k +1 + § k + 1· A[k − 1][k ] ¸¸ )+ n k (¨¨ © 2 ¹ M [k − 1] § k + 1· A[k − 1][k-1] § k + 1· A[k − 2][k − 1] ¸¸ ¸¸ )+ n k −1 (¨¨ - ¨¨ © 2 ¹ M [k-1] © 3 ¹ M [k − 2] § k + 1· A[k − 1][k − 2] § k + 1· A[k − 2][k − 2] § k + 1· A[k − 3][k − 2] ¸¸ ¸¸ ¸¸ − ¨¨ + ¨¨ )+ n k −2 (¨¨ © 2 ¹ M [k − 1] © 3 ¹ M [k − 2] © 4 ¹ M [k − 3]
ǻŗŜǼ
... § k + 1 · A[ p − 1][ p] § k + 1· A[k − 1][ p] § k + 1· A[k − 2][ p] ¸¸ ¸¸ ¸¸ − ¨¨ + ... + (−1) k + 2-p ¨¨ )... n p (¨¨ 2 3 − − [ 1 ] [ 2 ] M k M k © ¹ © k + 2 − p ¹ M [ p − 1] © ¹ § k + 1· A[k − 1][1] § k + 1· A[k − 2][1] § k + 1· A[0][1] ¸¸ ¸¸ ¸¸ − ¨¨ + ... + (−1) k +1 ¨¨ )+ n(¨¨ 2 3 − − [ 1 ] [ 2 ] M k M k © ¹ © ¹ © k + 1¹ M [0] § k + 1· A[k − 1][0] § k + 1· A[k − 2][0] § k + 1· A[0][0] ¸¸ ¸¸ ¸¸ − ¨¨ + ... + (−1) k +1 ¨¨ (¨¨ ) 3 2 − − [ 1 ] [ 2 ] M k M k © ¹ © ¹ © k + 1¹ M [0]
ȱȱȱǻŗŜǼȱãȱȱ £ǰȱȱȱȱȱȱ ûȱǰȱ£ȱ ȱ£DZȱ ȱ
9
Potenzsummen
§ k +1 · ¨¨ ¸¸ k +1-t © k + 1 − t ¹ W [t ] = ( −1) , ûȱȱȱȱŖȱǂȱȱǂȱȬŗȱ M [t ]
315
(17)
ȱǻŗŝǼȱ ȱȱǻŗŜǼȱ£DZȱ
ȱ ( k + 1) S k ( n) = n k +1 + n k (W [k − 1] A[ k − 1][k ]) + n k −1 (W [k − 1] A[ k − 1][k − 1] + W [ k − 2] A[ k − 2][k − 1]) + n k − 2 (W [k − 1] A[ k − 1][k − 2] + W [k − 2] A[k − 2][k − 2] + W [k − 3] A[ k − 3][k − 2]) + ...
ǻŗŞǼ
n p (W [ k − 1] A[ k − 1][ p ] + W [k − 2] A[k − 2][ p ] + ... + W [ p − 1] A[ p − 1][ p]) + ... n(W [k − 1] A[ k − 1][1] + W [k − 2] A[k − 2][1] + ... + W [0] A[0][1]) + (W [k − 1] A[k − 1][0] + W [ k − 2] A[ k − 2][0] + ... + W [0] A[0][0])
ȱȱȱȱȱȱȱǯȱȱǽŖǾǽŖǾƽŖȱ§ȱȱȬ ȱǽŖǾǽŖǾǽŖǾȱ ǯȱȱ £ȱȱ£ȱȱȱȱȱ ȱãȬ ȱȱȱ¢ȱȱȱûȱǽǾȱȱ DZȱ ȱ k −1 ° W [t ] A[t ][0] für p = 0 ° t =1 °° k −1 (19) F [ p ] = ® W [t ] A[t ][ p] für alle p mit 1 ≤ p ≤ k °t = p −1 °1 für p = k + 1 ° °¯
¦
¦
ȱ ȱȱǻŗşǼȱȱǻŗŞǼȱ£ǰȱDZȱȱ
ȱ S k ( n) =
ȱ
1 ( F [ k + 1]n k +1 + F [ k ]n k + F [ k-1]n k-1 + ...F [1]n + F [0]) k +1
(20)
ȱȱȱǰȱȱȱȱȱȱȱ§ȱǯȱȱ ûȱ ȱȱȱȱȱȱǯȱȱȱ ǰȱȱ ȱȱ ȱȱȱȱǽŖǾǰȱǽŗǾǰȱdzǰȱǽǾǰȱǽƸŗǾȱȱȱȱȱȬ ǯȱȱ ȱȱȱǻŘŖǼDZȱ ȱ
316
Grundlegende Algorithmen mit Java
1 ( F'[ k + 1]n k +1 + F'[k ]n k + F'[k-1]n k-1 + ...F'[1]n + F'[0]) , ȱ ȱ ȱǻŘŗǼȱ ( k + 1)Q F'[r ] = F [r ] ⋅ Q, 0 ≤ r ≤ k + 1 ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ǽǾȱ ǰȱ ȱ ȂǽǾȱ£ȱǰȱȱǻƸŗǼȱȱȱȱȱûȱǻǼȱǯȱ S k (n) =
Der Algorithmus ȱȱȱȱȱǰȱȱǽŖǾƽŗǰȱǽŖǾǽŗǾƽŗǰȱǽŖǾǽŖǾƽŖǯȱȱ ȱȱȱDZȱ ȱ ȏȱ ȱ ŗǯ ȱȱǻŖȱ≤ȱȱ≤ȱŘŖǼȱ ȱ Řǯ ǻȱǽƸŗǾǽƸŗǾȱǼȱ ȱ řǯ ǽŖǾƽŗǰȱǽŖǾǽŗǾƽŗǰȱǽŖǾǽŖǾƽŖȱ Śǯ ȱǻȱ←ȱŗǰȱDzȱȱŗǼȱ¡ȱȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱŚǯŗǯȱȱƽȱŗȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱŚǯŘǯȱȱǻȱ←ȱȬŗǰȱŖDzȱȱȬŗǼȱ¡ȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱǽǾȱƽȱ¢ǻȱȘȱǽƸŗǾǽƸŗȬǾȦǽǾǼȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱƽȱȱȘȱǻȬŗǼȱ ȱ ȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱŚǯřǯȱȱǻȱ←ȱǰȱŖDzȱȱȬŗǼȱ¡ȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱǽǾȱƽȱǻŖȦŗǼȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱǻȱ←ȱȬŗǰȱȬŗDzȱ≥ȱŖDzȱȱȬŗǼȱ¡ȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǽǾǯȱǻǽǾȘǽǾǽǾǼȱ ȱȱȱȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱŚǯŚǯȱǽƸŗǾȱƽȱȱǻŗȦŗǼȱ ȱ ȱȱȱŚǯśǯȱȱȱȱȱȱȱȱȱȱƽȱȱǻǽǾǰȱƸŗǼȱ ȱ ȱȱȱŚǯŜǯȱǽǾȱȱȱƽȱǻƸŗǼȘȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱŚǯŝǯȱȱǻȱ←ȱƸŗǰȱŖDzȱȱȬŗǼȱ¡ȱȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ¡ȱȱȱƽȱ¢ȱǻǽǾȘǼȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱǽǾǽǾȱƽȱǻ¡Ǽȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȏȱ ȱ ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȏȱ śǯȱȱȱȱȱȱȱȱǽǾǰȱǽǾǽƸŗǾǰȱǽǾǽǾǰȱdzǰȱǽǾǽŗǾǰȱǽǾǽŖǾȱ ȱ ȱȏ ȏ ȱ ȱ
9
Potenzsummen
•
317
ȱȱŘȱȱȱȱ£ȱȱ£ȱȱƸŗȱǻ§đȱ ȱ ǻŗřǼȱ ȱ ȱ ȱ £ȱ ȱ Ƹŗǰȱ ȱ ǻǼȱ £ȱ Ǽǯȱȱȱȱȱȱȱȱȱ¢ȱ ȱȱ ȱȱDZȱ
ȱ
• •
•
•
ǽǾǽŖǾȱƽȱǽǾǽǾȱƽȱŗȱûȱŖȱ≤ȱȱ≤ȱƸŗȱ ǽǾǽǾȱƽȱǽȬŗǾǽȬŗǾƸǽȬŗǾǽǾȱûȱȱŗ≤ȱȱ≤ȱƸŗǰȱŗȱ≤ȱȱǀȱȱȱȱȱȱȱ ȱ ȱȱřȱ ȱȱȱȱûȱŖǻǼȱȱǻǻŘǼƸǻŗŚǼǼȱ ȱŚȱȱȱǰȱȱȱ ȱȱȱǽǾǽŖǾǰȱǽǾǽŗǾǰȱǯǯǯǰȱ ǽǾǽƸŗǾǰȱǽǾǰȱŗȱ≤ȱȱ≤ȱȱûȱ ǰȱȱȱȱãȱûȱŗǰȱŘǰǯǯǯǰȱȱ §đȱȱȱȱ ŚǯŗȱȱŚǯŘDZȱȱûȱǽǾȱ ȱȱȱǻŗŝǼȱǯȱȱȱ ¢ǻǼȱ ȱ ȱ û£ȱ ȱ ȱ ȱ £ûǯȱ ȱ ȱȱȱȱȱȱãđȱȱȱ ȱȱȱ§ȱǰȱȱȱȱȱȱȱȱ ȱ Śǯřȱ ȱ ȱ ûȱ ǽǾȱ ȱ ȱ ȱ ȱ ȱ ǻŗşǼȱ ȱ ȱ ȱ ǻǼȱ ǻȱ ȱȱ ȱ £ ȱ ȱ ûȱ Ǽȱ
1 1
•
ȱ ȱȱǻŗşǼȱȱȱŚǯśȱȱȱǽƸŗǾȱȱ ȱȱ
•
ȱ ȱ Śǯśȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ǽŖǾǰȱ ǽŗǾǰȱ ǯǯǯǰȱ ǽǾǰȱ ǽƸŗǾȱ ǯȱ ȱ ȱ ȱ ȱ ȱǻȱǼȱ ȱȱŚǯŜȱ ȱȱȱǽǾȱ§đȱǻŘŖǼȱ£ȱ ȱ ȱ ȱ ȱ Śǯŝȱ ȱ ȱ ȱ ǻŘŖǼȱ ȱȱ ǽǾǽƸŗǾǰȱ ǽǾǽǾǰȱ dzǰȱǽǾǽŖǾȱǯȱ
• •
ȱȱ
¡§ȱȱ ȱȱǯȱȱ ¡§ȱȱȱȱ ǻřǼȱ ǻȱ Śȱ ȱ ȱ ȱ ȬǼǰȱ ȱ ȱ ȱ ȱ ¢ǯȱ ȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ Ȭ ȱ£ȱǯȱȱ ȱ £ȱ ȱ ǻǼȱ ȱ ȱ ȱ ȱ ȱ ȱ ûȱ ǯȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ãDZȱ ǻŖǼǰȱ ǻŗǼǰȱǯǯǯǰȱǻȬŗǼǯȱȱȱȱȱȱȱȱȱûȱǻǼDZȱ ȱ Lösung ( Pk ) = Kombination( Lösung ( P0 ) ,Lösung ( P1 ) ,...,Lösung ( Pk −1 )) ȱ ȱ
318
Grundlegende Algorithmen mit Java
ȱãȱȱȱǻǼȱȱȱȱãȱȱȱǻƸŗǼǰȱǻƸŘǼǰȱdzȱ ǰȱ ȱ ȱȱãȱȱȱȱȱȱȱǰȱ ȱ §ȱ ȱ ȱ ãđȱ ȱ ȱ £ȱ £ȱ ãǯȱ ȱȱȱȱȱ¢ȱǯȱ
ȱ A[k][0]
A[k][1]
A[k][2]
A[k][3]
A[k][4]
A[k][5]
0 0 0 0 0
1 1 1 0 -1
1 3 1 0
2 2 10
1 15
6
A[k][6]
M[k]
1 2 6 4 30
← ãȱȱƽȱŖ ← ãȱȱƽȱŗ ← ãȱȱƽȱŘ ← ãȱȱƽȱř ← ãȱȱƽȱŚ ← ãȱȱƽȱś
ȱ §DZȱûȱȱ ȱ ȱȱȱȱȱ §ȱ ȱ ȱǰȱȱȱ ȱ ûȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ȱ ȱ ȱ §ǰȱȱȱȱȱȱǯȱ
Programm import java.io.*; import java.util.*; public class P01SumOfPowers { private static final String FileInputName = "psum.in"; private static final String FileOutputName = "psum.out"; private final static int MAX_NO = 20; private static void genCombinations(long C[][], int n) { C[0][0] = 1; £ȱǻȱ for (int i = 1; i k , k ≠ 0 } © k ¹ © k − 1¹ © k ¹ (ȱûȱȱ ȱȱ ¢ȱ)
public static void main(String args[]) throws IOException { Scanner scanner = null; PrintStream out = null; try { scanner = new Scanner(new File(FileInputName));
9
Potenzsummen out = new PrintStream(new File(FileOutputName)); Fraction fr[] = new Fraction[MAX_NO+2]; Fraction W[] = new Fraction[MAX_NO+1]; long C[][] = new long[MAX_NO+2][MAX_NO+2]; genCombinations(C, MAX_NO+1); long M[] = new long[MAX_NO+1], Q; M[0] = 1; long A[][] = new long[MAX_NO+1][MAX_NO+2]; A[0][1] = 1; A[0][0] = 0; for (int p = 1; p = 0; t--) { W[t] = new Fraction(sign*C[p+1][p+1-t], M[t]); sign *= -1; } for (int t = p; t >= 0; t--) { fr[t] = new Fraction(); for (int r = p-1; r >= t-1 && r >= 0; r--) { fr[t].add(W[r].multiply(A[r][t])); } } fr[p+1] = new Fraction(1, 1); Q = Fraction.lcmDenomin(fr, p+1); M[p] = (p+1)*Q; for (int t = p+1; t >= 0; t--) { A[p][t] = fr[t].multiply(Q).getNumerator(); } } while (scanner.hasNextInt()) { int k = scanner.nextInt(); out.print(M[k]); out.print(' '); for (int t = k+1; t >= 0; t--) { out.print(A[k][t]); out.print(' '); } out.println(); } } finally { if (scanner != null) scanner.close(); if (out != null) out.close(); } }
}
319
320
Grundlegende Algorithmen mit Java
class Fraction { private long numerator; private long denominator; Fraction(long numerator, long denominator) { this.numerator = numerator; this.denominator = denominator; this.simplify(); } Fraction() { this.numerator = 0; this.denominator = 1; } long getNumerator(){ return numerator; } void add(Fraction other){ this.numerator = numerator*other.denominator + denominator*other.numerator; this.denominator = denominator*other.denominator; this.simplify(); } Fraction multiply(long n){ return new Fraction(numerator*n, denominator); } private static long gcd(long a, long b) { while (b != 0) { ȱȱǻǼDZȱ long r = a % b; ȱ ȱ ãđȱ ȱ ȱ a = b; ǻǼȱ£ ȱûȱȱ b = r; } return a; } void simplify() throws ArithmeticException { long d = gcd(this.numerator, this.denominator); this.numerator /= d; Ȭȱ ȱ ȱ ãđȱ ȱ this.denominator /= d; ȱȱȱȱ§ȱȱ if (this.denominator < 0) { Ȭȱ û£ȱȱȱ this.denominator *= -1; Ȭȱ ȱ ƽƽŖǰȱ ȱ ¡ȱ this.numerator *= -1; ȱ } }
9
Potenzsummen
321
static long lcm(long a, long b) { return (a/gcd(a, b))*b; }
ȱ ȱ ȱ ȱ ȱ ûȱȱȱȱȱȱȱ a ⋅ b ȱ gcd( a, b)
static long lcmDenomin(Fraction fr[], int long gcd = 1; if (n == 0) return 1; gcd = fr[0].denominator; for (int i = 1; i < n; i++) { gcd = lcm(gcd, fr[i].denominator); } return gcd; } }
n) { ȱ ȱ ȱ ȱȱȱ ǻǼȱ ȱ ȱ ȱ ûȱ ǽǾǰȱ ȱȱȱDZȱ ȱǻµµǼȱƽȱȱǻǻµǼµǼȱȱ ȱ ǻȱ ȱ ȱ §ȱ ȱ £ȱ ȱ ǰȱȱ ȱ ȱ ȱ ȱ £ȱ ãđȬ ȱ£ȱ£ȱûǯǯǯǼȱ
Aufgaben ŗǯ Řǯ
ȱǰȱȱûȱřȱȱûȱȱǰȱǰȱȱDZȱȱȱǻµµǼȱƽȱ ȱǻǻµǼµǼǯȱ ȱȱǰȱȱȱ£ȱȱȱȱDZȱ S k (n) = Fk +1n k +1 + Fk n k + ... + F1n + F0 ǰȱȱ ȱ ȱƸŗǰȱǰȱǯǯǯǰȱŖȱû£ȱûȱǰȱ£ǯǯDZȱȱ n
S0 ( n) =
¦i
0
= nȱ
ȱ
ȱ
ȱ
ȱ
ȱ
i =1 n
S1 (n) =
¦i = 2 n 1
i =1 n
S 2 ( n) =
¦i i =1
2
2
1 + n ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ 2
ȱ
1 1 1 = n3 + n 2 + n ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ 3 2 6
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱȱȱȱȱǯȱ DZȱ psum.in 2 5 0
ȱ řǯ
psum.out 1/3 1/2 1/6 0 1/6 1/2 5/12 0 –1/12 0 0 1 0
ȱȱȱȱDZȱ
ȱȱȱȱȱȱȱǼȱ S3 ( x ) = ( S1 ( x)) 2 ȱ
322
Grundlegende Algorithmen mit Java Ǽȱûȱȱȱ≥ȱŗȱDZȱȱ¢ȱ S k (x) ȱȱȱ S1 ( x) ȱȱȱ
S k ( x) = S k (−1 − x) ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱ ǻŘŘǼȱ Ǽȱûȱȱȱȱ≥ȱŗȱDZȱȱ¢ȱ S k (x) ȱȱȱ S 2 ( x) ȱȱȱ ȱ
S k ( x) = − S k (−1 − x) ȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱȱ ȱ ǻŘřǼȱ Ǽȱûȱȱȱ≥ȱřȱDZȱȱ¢ȱ S k (x) ȱȱȱ S3 ( x) ȱǯȱ Ǽȱȱ S k ( n) = ak +1n k +1 + ak n k + ... + a1n + a0 ȱȱ ak − 2 = ak − 4 = ... = 0 ǯȱȱ
DZȱ ȱ ãȱ ȱ £ȱ £ ȱ S k (x) ȱ ȱ S k ( − x) ȱ ȱ ȱ ȱ ǻŘŘǼȱȱǻŘřǼȱǯȱ ȱ
ȱ
ȱ ȱ ȱôȱȱȱ§ȱ ȱ ȱ ȱ
ȱȱȱȱȱȱȱȱǯȱȱ ȱ ¢ȱ ȱ
Literaturverzeichnis ȱ
ȱ ǽŖŘǾȱ ǽŞřǾȱ ǽşřǾȱ ǽşŚǾȱ ǽŝŗǾȱ ǽŖŚǾȱ ǽŖŖǾȱ ǽşşǾȱ
ǽŖŘǾȱ ǽşŜǾȱ ǽ şŗǾȱ ǽ ŝşǾȱ
ȱǰȱ ûȱǯȱǰȱȱ ȱȱ ǰȱȱȬ ǰȱŘŖŖŘǯȱ
ȱǰȱȱȱ©ȱȱȱȱ©ȱ ǰȱ ȱ©ȱóȱ©ǰȱóǰȱŗşŞřǯȱ ¢ǰȱǯȱǯǰȱȱ¢ ǯȱȱǰȱȱȱǯǰȱ ǰȱŗşşřǯȱ ǰȱ ǯǰȱ ǰȱ ǯǰȱ Ȭ ȱ ȱ ȱ Ȭ ȱ Ȧǰȱ ȱ Ȃȱ ȱȱ ȱ ȱǰȱŗşşŚǯȱ ǯȱ ǯǰȱ ǯǰȱ ȱ ¡¢ȱ ȱ Ȭȱ ǰȱ ǯȱ řȱ Ȭ ȱȱ¢ǯȱ¢ȱȱǰȱǯȱŗśŗȬŗśŞǯȱ ǯȱ ǯȱǰȱǯȱǯȱǰȱǯȱǰȱǯȱǰȱȬȱȬ ûǰȱȱǰȱûǰȱŘŖŖŚǯȱ ȱǰȱ ǰȱȬǰȱ ǰȱŘŖŖŖǯȱ ǰȱǯǰȱǰȱǯǰȱ¡ȱȂȱȱȱȱȱ ȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ǯǰȱ ǯȱ řŖřȬřŖŜǰȱ ŗşşşȱ ȱ ǰȱ ȱ ȱ ȱ ǯȱ ȱ ȱ ȱ ǰȱ Ȃȱ ¢ǰȱ ǰȱŘŖŖŘǯȱ ȱ ǰȱ ȱ ǰȱ ȱ ǰȱ ǰȱ ŗşşŜǯȱ ȱ ǰȱ ȱ óȱ ȱ ȱ ©ǰȱ ȱ ©ǰȱ óǰȱŗşşŗǯȱ ¢ǰȱǯȱǯǰȱȱ ǰȱǯȱǯǰȱȱȱȱ¢DZȱȱ ȱȱȱ ¢ȱȱȬǰȱȱǯȱ ǯȱǰȱ ȱȱǯȱ
324 ǽ Ǿȱ ǽ şŚǾȱ ǽ ŖřǾȱ
ǽŖŘǾȱ
ǽ şŝǾȱ
ǽ şşǾȱ ǽ ûŖŜǾȱ ǽŖŗǾȱ ǽŖśǾȱ ǽŖśǾȱ ǽŖśǾȱ
ǽŖŜǾȱ ǽŖŜǾȱ
ǽŖŜǾȱ
ǽŖŜǾȱ ǽŖŝǾȱ ǽ§ŖŗǾȱ
Grundlegende Algorithmen mit Java £ȱ©ǰȱȱ£ǰȱȱȱ ȱ ǯȱ ǯǰȱ ȱ ǯȱ ǯǰȱ ȱ ǯǰȱ ȱ ǰȱ Ȭ¢ǰȱŗşşŚǯȱ ȱ ǰȱ ȱ ǯȱ ûȱ ȱ ȱ ȱ ȱ ȱ ¢ȱ £ȱ ǰȱ Řǯȱ ǰȱ ȱ ǰȱ Ȭ ǰȱŘŖŖřǯȱ ȱ óǰȱ ȱ ©ǰȱ ôȱ ǰȱ ȱ ©ǰȱ ȱ ƸƸǯȱ ȱ ȱ ȱ ȱ Ȭǰȱ ȱ ǰȱ óǰȱ ŘŖŖŘǯȱ ȱǯȱ ǰȱȱȱȱȱǰȱȱDZȱȬ ȱ ǰȱ Ȭ¢ȱ ǰȱ Dzȱ DZȱ řǯȱ ǯǰȱ ŗşşŝǯȱ ȱǯȱ ǰȱȱǯȱǰȱȱǯȱ Ȭ ǰȱǰȱȱǯǰȱȱǰȱŗşşşǯȱ ȱ ûǰȱ ȱȱ ȬǰȱŚǯǰȱȱȬ ǰȱȬ¢ǰȱûǰȱŘŖŖŜǯȱȱ ȱ ©ǰȱ ƸƸǯȱ ȱ £ȱ óȱ ǰȱ ȱ ǰȱ óǰȱŘŖŖŗǯȱ ȱ ©ǰȱ ȱ ȱ ǰȱ ǰȱ ŗśȦŘȱ ŘŖŖśǰȱ ǯȱ ŚŖȬŚřǰȱ DZȱDZȦȦ ǯǯȦȦŗśȏŘȦŘǯǯȱ ȱ ©ǰȱ kȱ ȱ ǰȱ ǰȱ ŗśȦśǰȱ ŘŖŖśǰȱ ǯȱ řŜȬŚŗǰȱ ȱ DZȱ DZȦȦ ǯǯȦȦŗśȏśȦŗǯǯȱ ȱ©ǰȱȱȱȱȱȱȱȱȱȱƸƸǰȱ ǰȱŗśȦśǰȱǯȱŘŝȬřŖǰȱDZȱ DZȦȦ ǯǯȦȦŗśȏśȦŗǯǯȱ ȱ©ǰȱ£ȱ©ȱÉȱǯȱôǰȱȱǰȱóǰȱ ŘŖŖŜǯȱ ȱ ©ǰȱ ȱ ǰȱ ȱ ¢ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ǰȱ řȱ ȱ ȱ ȱ
ȱȱȱǻ ǼǰȱȱřşŖŝǰȱǯȱřŘŖȬřřŗǰȱ ǰȱŘŖŖŜǯȱ ȱ©ǰȱ ¢ȱȱȱȱȱȱȱ ȱȱ ȱ ǰȱ ȱ ȱ ȱ ȱ ŘŖŖŜǰȱȱ ¢Ȭ ȱȱȱǰȱǯȱŜśȬŞŖǰȱóǯȱ ȱ ©ǰȱ ȱ ȱ ãȱ ȱ ƸƸǰȱ Ȭ ǰȱǰȱŘŖŖŜǯȱ ȱ ©ǰȱ ȱ ȱ Éȱ ƸƸǯȱ ôǰȱ ǰȱ óǰȱ ŘŖŖŝǯȱ ȱ đȱ §ǰȱ ȱ ȱ ǯȱ ȱ ǯǰȱ ûǰȱŘŖŖŗǯȱ
Literaturverzeichnis ǽŖŘǾȱ ǽşśǾȱ ǽşŝǾȱ ǽşŞǾȱ ǽ©ŞřǾȱ ǽŖŚǾȱ ǽşŞǾȱ ǽşŝǾȱ ǽşşǾȱ ǽŖřǾȱ ǽşŝǾȱ ǽŞŜǾȱ ǽŜŜǾȱ ǽŜŝǾȱ
ǽŖŜǾȱ ǽŞŗǾȱ ȱ
325
ǯȱ ñǰȱ ǯȱ ñìǰȱ ȱ ǯȱ ȱ ǰȱ ȱǰȱŘŖŖŘǯȱ ǰȱǯǰȱǰȱǯǰȱ ǰȱǯȱǯǰȱȱȱȱȱȬ ǰȱȱȂȱȱȱȱ¢ǯǰȱŗşşśǯȱ ǰȱ ǯǰȱ ǰȱ ǯǰȱ ǰȱ ǯȱ ǯǰȱ ȱ ȱ ȱ Ȭ ȱǰȱȱȱȂȱǯȱȱǰȱŗşşŝǯȱ ǰȱǯǰȱǰȱǯǰȱǰȱǯǰȱȱȱȱȬ ȱȱ£ȱǰȱȱȱȱǯǰȱǯȱŜşŚȬŜşŝǰȱŗşşŞǯȱ ǯȱ ©©ǰȱ ǯȱ ô©ǰȱ ǯȱ ǰȱ ǯȱ ôǰȱ ¡ôȱ óȱ ȱ ȱ ©ǰȱȱ©ȱóȱ©ǰȱóǰȱŗşŞřǯȱ ȱ £ǰȱ ȱ ûȱ ǯȱ ȱ ȱ ȱ ȱ ȱ Ȭ ǰȱ ȱǰȱǰȱŘŖŖŚǯȱ
£Ȭȱ ǰȱ ȱ ûǰȱ ȱ ǰȱ ȱ ȱ ǯȱǰȱ ȱȱȱ ǰȱŗşşŞȱ ȱǰȱȱǯȱȱȱȱȬǰȱȱȱȬ ǰȱǰȱŗşşŝǯȱ ȱ ǰȱ ȱ ǯȱ ȱ ǰȱ ȱ ȱ ǰȱǰȱŗşşşǯȱ ȱ ǯȱ ǰȱ ȱ ǯȱ ǰȱ ȱ ǯȱ ȱ Ȭ ȱȱȱǰȱȬǰȱ ȱǰȱŘŖŖřǯȱ ǰȱǯǰȱȱȱȱ¢ȱȱǰȱȬ ǰȱǰȱ ǯȱ ǯȱǰȱǯȱǰȱȱǰȱȬǰȱ Ȭ ǰȱŗşŞŜǯȱ
ȱǰȱûȱȱȱãȱǰȱȱDZȱ ǰȱ ǯȱǰȱûȬǰȱŗşŜŜǯȱ
ȱǰȱûȱȱȱãȱǰȱȱDZȱȱȬ ȱ ȱ ȱ §ǰȱ ǯȱ ǰȱ ûȬǰȱ ŗşŜŝǯȱ ȜȱǰȱȱȱŜȱȱǰȱȱ£DZȱ DZȦȦǯǯȦȦŜȦȦȦǰȱȱ¢ǰȱǰȱŘŖŖŜǯȱ ȱ ǰȱ ȱ ȱ ©ȱ óȱ ȱ ǰȱ ȱ ©ȱóȱ©ǰȱóǰȱŗşŞŗǯȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
326
Grundlegende Algorithmen mit Java
ȱ£ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ ȱ
ȱ ȱDZȦȦǯ ǯȦ Ȧ ȱ ȱDZȦȦǯǯȦȦȱȱ ȱDZȦȦǯǯǯȦȱȱ ȱDZȦȦ ǯ ǯȦȱȱ ȱDZȦȦ¢ǯǯȦȦȦȦȱȱ ȱDZȦȦ¢ǯ ǯǯȦȦȱȱ ȱDZȦȦ ǯǯȦȱȱ ȱDZȦȦ ǯ ǯȦȱȱ ȱDZȦȦ ǯȬȬǯȱ ȱDZȦȦ ǯǯȦȱȱ ȱDZȦȦǯǯȦDžřȦŖǯȱȱ ȱDZȦȦǯȦȬȦȱȱ ȱDZȦȦ ǯǯǯȦȦȦŘǯȱ ȱDZȦȦ ǯǯȱ ȱDZȦȦ ǯȬǯȱ ȱDZȦȦ ǯȬǯȦǯȱ ȱDZȦȦ ǯǯǯȦ ȦŘŖŖŜȦŖŜŖŘŗŚȏǯȱȱ ȱDZȦȦ Ȭŗǯǯ ȬǯȦDžȱ ȱDZȦȦ ȬǯǯȦDžȦȦǯȱ ȱDZȦȦǯǯȦȦŜȦȦȦȦȦ¢ǯȱ ȱDZȦȦǯȦȬȦ ȦȦǯȱ ȱDZȦȦ ǯǯȬȱ ǯȦȦŘŖŖřȦ¢ȦȦŖřŖşǯȱ ȱ ȱ ȱȱȱ ȱ ȱ
Stichwortverzeichnis ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
řȬȬȱȱŘřŘȱ ̋ȬȱȱŗŘȱ ̛Ȭȱȱŗřȱ ƋȱȱŗŗŚǰȱŗŜśȱȱȱ
A ȱȱŗŖŜȱ absȱȱŗŝŚǰȱŗŞŗǰȱŗşŖǰȱŘŝŝȱ ȱȱȱŘŚŖȱȱ ȱȱŗŗȱ ȱ ȇȱ ȱ ȱ ȱ Ȭ
£ȱȱŗȱ §§ȱȱřŜȱ ǰȱȱȱŗŗŞȱȱ ȱȱŗŗŞȱ addȱȱŚŘǰȱśŚǰȱŜŖǰȱşŗǰȱŗřŗǰȱŗřŚǰȱŗŚŖǰȱŗŚŝǰȱŗŜśȱ addFirstȱȱşŗȱ addLastȱȱşŖȱȱȱ £ȱȱŘŘŘȱȱȱ ££¡ȱȱŞǰȱŜŞǰȱŘŘŘȱȱ §ȱȱȱŘŜŗȱȱȱ ȱŗŖǻǼȱȱ ȱǻǼȱȱŘşȱ ȱ ȏǻǼȱȱŘŞŞȱȱȱ ȏȏȱȱŗŝŜȱȱȱ ȏȏȱȱŗŝŜȱȱ ȏ ȏ ȱȱśȱȱ ȏȏ ȱȱŘŞŝȱȱȱ ȏȱȱŗŚŜȱ ȏŗŖȱȱŗŘŗȱȱȱ ȏ ȱȱŘȱ
ȏ ȏȱȱŝŚȱ ȏȱȱŗŜřȱȱȱ ȏȱȱŘřřȱ ȏȱȱŘřřȱ ȏ ¢ȱȱřşȱȱ ȏ ȏȱȱŘŗŘȱ ȏ ȱȱśşȱ ȏ ȱȱśŗȱ ȏȱȱŘŚŜȱȱ ȏȏȱȱŗŝřȱȱ ȏ ȏȱȱŞŖȱȱ ȏ ȏȱȱŝŞȱȱ ȏȏȏȱȱŘŖŞȱȱȱ ȏȱȱřŗŜȱ ȏȏȱȱŝřȱ ȏȏȱȱŝřȱ ȏȱȱŝşȱȱ ȏŘȱȱŞŖȱ ȏ ȏȱȱŗŖŞȱȱ ȏȏ ȱȱŚȱ ȏȱȱŝşȱ ȏȱȱŜȱ ȏ ȏ ȱȱŘŞȱ ȏ ȏ ȱȱřŖŝȱ ȱǻǼȱȱȱȱŗŜŚȱ ȱȱȱȱȱŝśȱȱ ȱȱŗŖȱ Ȭȱȱŗȱ ȱȱŗŖȱ allocateȱȱŘŚŘǰȱŘŝŘȱ ¢ȱȱ ¡§ȱȱŗŜȱ £ȱȱ ȱȱŗŞŗȱ
328 £ȱȱȬȱȱŗŝŞȱ £ȱȱȱȱŗŝşȱ £ȱ ȱ ȱ ûȱ ȱ Ȭ ȱȱřŖŚȱ £ȱȱ £ȱ¡ȱȱŗśŞȱ £ȱȱȱȱȱŗŞŜȱ £ȱȱȱȱȱȱŗŖŝȱ £ȱȱûǰȱûȱȱ ȱȱŗśŖȱȱ £ȱ§ȱ§§ȱȱŜřȱ appendȱȱřśǰȱŗŗŖǰȱŗŜŖȱ ȱȱřŖśȱ ArithmeticExceptionȱȱřŘŖȱ arraycopyȱȱŞŖǰȱŞŝȱ ArrayDequeȱȱŞřǰȱŞşȱ ArrayListȱȱŚŗǰȱśŘǰȱśŚǰȱŜŖǰȱşŗǰȱŗŚŜǰȱŗśŚǰȱŗŜśȱ ArraysȱȱřŖǰȱřřȱ asListȱȱřřȱ assertȱȱřŖǰȱřŜȱ AssertionErrorȱȱřŜȱȱȱ ȱȱŘřŞȱȱȱ ȱȱȱŘŝǰȱŘŚŖȱ ȱȱřŚȱ ¢ȱȱřŚȱ ȱŗŖŖȱ ȱȱȱȱşŚȱȱȱ
B ȱȱŗŜşǰȱŘřśȱ ǰȱǰȱȱȱ ȱȱŘŘŜȱ ȱȱȱȱȱŘŘŞȱȱ ȱȱŚşǰȱŗŖśǰȱŗśŝǰȱŘřřȱ ȱȱǵDZȱȱŚřǰȱŜŘǰȱŗŘŜǰȱŗŚŝǰȱŗŜŗǰȱ ŘŖşǰȱŘśśȱ ȱȱŘśǰȱŗŝŘȱ ǰȱȱȱŘřŗȱ ȱ£ȱȱŗŜşȱȱȱ ȱȱȱŗŖśȱ ȱȱŗŖȱȱ ȱȱȱȱȱŘřŗȱ ȱȱŗŗǰȱŗŖŖǰȱŗŖşǰȱŗŗŗǰȱŗŘŞǰȱŘŚŖȱ ȱ ȱ §ȱ ȱ ȱ ŗŖŗǰȱ ŗŖřȱȱȱ ££ǰȱ¡ȱȱŗŜşȱ BigDecimalȱȱŗŗŚȱ
Grundlegende Algorithmen mit Java BigIntegerȱȱŗŗŗǰȱŘřşȱȱ ȱȱȱŗŞȱ §ȱȱśŜȱȱȱ §ȱȱȱŚȱ § ȱȱśŜǰȱŜśȱȱȱ £ȱȱŘřśǰȱŘřşǰȱŘŝřǰȱřŗŞȱȱȱ ȱ £ȱ ǻ Ȃȱ Ȭ ǼȱȱŗŖŘǰȱřŗŘȱȱȱ Ȭȱ BitSetȱȱŞŚǰȱŘŖŗǰȱŘŗŞȱ ȱȱśŜȱ BooleanȱȱŜŘǰȱŞşȱ ȬȬ£ȱȱŘřŚȱ ȬȬȱȱŜŜȱȱ
C P ]164ȱȱ ·ȱȱȱŘŗŚȱȱ §ǰȱ ȱȱŗŚśȱȱȱ ȬȱȱŜřǰȱŘŘŚǰȱŘŝśǰȱŘŞŜǰȱŘşŘȱ catchȱȱřŗǰȱřŚȱȱȱ ¢Ȭ £Ȭȱ ǻ £Ȭ ȱǼȱȱŗŖŘȱ CharacterȱȱŘŗŝȱ charAtȱȱŜŖǰȱŗŜŖǰȱŘŖşǰȱřŖŘȱ clearȱȱŞŝǰȱŘŖřǰȱŘŗŖǰȱŘŗşȱ cloneȱȱŘŖřȱȱȱ closeȱȱřŗǰȱŚŘǰȱŚśǰȱŚŞǰȱśŚǰȱŜŗǰȱşŚǰȱŗŗŖȱ Ȭȱȱŗşȱȱ ȱȱȱ§ȱȱśŜȱ ȱȱȱ§ȱȱśŜȱ £ȬȱȱŗŖŜǰȱŗŘśȱ CollectionsȱȱŚŖǰȱŚŘȱȱȱ ȏȱȱŘŗŗȱ ComparableȱȱŘşǰȱřřǰȱŚŘǰȱŜŗȱ compareȱȱŚřȱ compareToȱȱřŖǰȱřřǰȱŚŖǰȱŚřǰȱŜŘȱ ȱȱȱŗŖŜǰȱŗŗŞȱ ǰȱȱǰȱǯȱǯȱȱŘŖȱ currentTimeMillisȱȱŘřŝȱȱȱ
D ȱȱŝǰȱřŘǰȱŗŘŗȱ
Stichwortverzeichnis ȱȱȱȱŜśȱȱȱ ȱȱřŘǰȱŚŖǰȱŗŜřǰȱŘśśǰȱřŗşȱ ȱȱŜśȱ ȱȱ £ȱȱ ȱŗŜŝȱ Ȭ ȱȱřŘȱ ȱȱśŜȱ deleteȱřŖřȱ DequeȱȱŞŘǰȱŞşȱ ȱȱŗŖȱȱ ȱȱȱŘȱȱ ȱȱŚȱȱŗŖŞȱ digitȱȱŘŗŝȱ DimensionȱȱŗřŗǰȱŗřřǰȱŗřŞȱȱȱ ȱȱȱŗŖŜǰȱŗřŖȱȱ ȱ ȱȱŗŖŖǰȱŗŖŘǰȱŗŖşǰȱŗŗŗǰȱŗŘŞȱȱȱ ȱ Ȭȱ ǻǼȱȱ ŗŜŘȱ ȱȱȱȱŗŚśȱȱ ȱȱȱȱŗŗŗȱȱ ȱȱŘśřȱ ȱȱûȱȱŗŜŞȱ ǰȱȱȱŜŜǰȱŝŗȱ DoubleȱȱśŘȱ ȱȱȱȱŞŘȱ drawLineȱȱŗřşȱ drawOvalȱȱŗřřȱ drawRectȱȱŗřŗǰȱŗřŚȱ ȱȱŜŝȱȱ Ȭ §ȬȱȱŝŞȱ ¢ȱȱȱŘŝǰȱŘřŗȱȱȱ
E Ȭ£ȱȱŘşŝȱȱȱ £ȱȱŗŜŘȱ ȱȱȱŗŗȱ ȱȱŗŖȱ ȱȱŗŖŜȱ enstrySetȱȱśśǰȱŜŖǰȱşŘȱȱȱ ȱȱŗŞǰȱŝŘȱ ȱȱ ¢ȱȱřȱ ûȱȱŘŖȱ ȱȱȱşśȱ ȱȱȱşŜȱ ȱȱŘȱȱȱ
329 ȱȱȱŘŞŞȱȱ ȱȱȱŘǰȱřŘŖȱ ǰȱȱȱŗŜŚǰȱŘŗŚȱ ¡ȬȱǻǼȱȱŝŚȱ EXIT_ON_CLOSEȱȱŗřŗǰȱŗřŚȱȱȱ ¡ȬȱȱŜŜȱ
F ȱȱȱǻǼȱȱȱ ȱȱȱŗŖŜǰȱŗŘřȱ ȱǻȱǼȱȱŘřŜȱȱȱ ȬȱȱŗŖśǰȱŘřŘȱ FileȱȱřŖǰȱřśǰȱŚŗǰȱŚŚǰȱśřǰȱŜŖǰȱŗŗŖȱ FileReaderȱřśȱ fillȱȱřŗǰȱŘśşǰȱŘŝŝȱȱȱ finallyȱȱřŗǰȱřŚǰȱŚśǰȱdzǰȱŗŗŖǰȱdzȱ FloatBufferȱȱŘŝŘȱ flushȱȱŘřŞȱ Ȭȱ ȱ śŚǰȱ ŜŘǰȱ şŖǰȱ ŗŜŜǰȱ ŗŝŚǰȱ ŗŞŝǰȱ ŘŖŚǰȱŘŗŖǰȱŘŚŘǰȱŘŜŖǰȱŘŝŝȱ FormatterȱȱŗŘřȱ ȱȱŗśŞȱ ȱȱŗşŗȱ ȱȱŗřśȱȱȱ ȱȬȱȱŗŚŗȱ
G gcdȱȱŗŗŗȱ £ȱȱřŘȱ ȱȱŘŖŞǰȱřŗŝȱ ȱȱŗřśȱ ȱȱȬȱȱŞŖȱ ȱȱȬȱȱŝŞǰȱŗŝŖȱ ȱȱȱȱŗŝşȱ ȱȱȱŗŘŞȱ £ȱȱȱȱŜŝȱ getȱȱŚŘǰȱśŘǰȱŜŖǰȱşŗǰȱŗŚŝǰȱŗŜśǰȱdzǰȱŘŗŖǰȱŘŚŘȱ getContentPaneȱȱŗřŗǰȱŗřŚǰȱŗŚŖȱ getDefaultToolKitȱȱŗřŗȱ getFirstȱȱşŗȱ getKeyȱȱśśȱ getLastȱȱşŗȱ getScreenSizeȱȱŗřŗȱ
330 getSizeȱȱŗřŗǰȱŗřřǰȱŗřŞǰȱŗŚŖȱ getValueȱȱśśǰȱŜŗȱ ȱȱ ȱȱŚşȱ ȱȱ Ȭȱȱśŝȱ ȱȱ ȱȱŚşȱ ¢ȱȱǰȱȱȱřŞȱ ȱȱŗŖŘǰȱŗŘřǰȱŘŘśǰȱŘŞŗȱ ȱȱȱȱřŗŖȱȱȱ ȱȱşǰȱŗŞǰȱŚŞǰȱŝśǰȱŘřřȱ §ȱȱŘŖȱ ȱȱŘŖȱȱ GraphicsȱȱŗřŗǰȱŗřřǰȱŗřŞȱ ¢ȱȱřşǰȱŘřśȱ ¢ȬȬȱǻ ǼȱȱŝŚȱ ¢ȬȬȬȱ ǻ Ǽȱȱ ŝŚȱ ¢ǰȱ ȱȱŗŗŚȱ £ ȱȱŗŚȱ ãđȱȱȱȱŘǰȱŗŚŜǰȱřŘŖȱ
H
ȱȱŗşȱȱȱ
Ȭ£ȱȱŜŜǰȱŘşŞȱ
ȱȱŗŞǰȱřşȱ HashSetȱȱŘŖŗȱ hasNextȱȱśśǰȱŜŖǰȱŘŗşȱ hasNextDoubleȱȱŗśŘǰȱŗŜŜȱ hasNextFloatȱȱŚŘȱȱȱ hasNextIntȱȱřŖǰȱřśǰȱŗŗŖǰȱŗŗŜǰȱŗŘŚǰȱŗŚŝǰȱŗśŚȱ hasNextLongȱȱŗŗşǰȱŗŘŗǰȱŗŘŜǰȱŘŞŚȱ hasPreviousȱȱŜŗǰȱŘŚşȱȱȱ
ȱȱȱȱŘŘŗȱ heightȱȱŗřŗǰȱŗřřǰȱŗřŞȱ
ǰȱǯȱǯȱǯȱȱŗśřȱ
£ȱȱȱȱȱŘřŖȱ
ǰȱȱȱśŜȱ
ȬȱȱśŜȱ
Ȭ ȱȱśŜȱȱȱ
I §ȱȱȱŗȱ §ȱȱŗŜŘȱȱȱ ȱȱȱŗŖŜǰȱŗřřȱ
Grundlegende Algorithmen mit Java ȱȱŗŖŖȱ ȱȱŗŖŖȱ £ȱȱŗŖŖȱ ȱȱŗřśȱ insertȱřŗǰȱřśǰȱřŖřȱȱȱ IntBufferȱȱŘŚŗȱ Integer śŘǰȱŜŖǰȱŞşǰȱdzǰȱŗśŚ Integer.MAX_VALUEȱȱŚŝǰȱŘśŞǰȱŘŝŜȱȱȱ ȱȱŗśŖȱ ȱȱřřȱ intersectsȱȱŘŖŚȱ intValueȱȱśřǰȱşŖȱ ȱȱŜŜȱ IOExceptionȱȱŚŗǰȱŚŚǰȱŚŝǰȱśřǰȱŜŖǰȱşřǰȱŗŗŗȱ isDigitȱȱŘŗŝȱ isEmptyȱȱśśǰȱŜŖǰȱŘŖŚȱ ȱȱŗŞȱ isProbablePrimeȱȱŗŗŗȱ IteratorȱȱśŚǰȱŜŖǰȱşŗȱ iteratorȱȱśśǰȱŜŖǰȱşŗȱȱȱ
J JFrameȱȱŗřŗǰȱŗřŚǰȱŗřşȱ JPanelȱȱŗřŗǰȱŗřřǰȱŗřŞȱ
K
ȱȱȱȱŘŚȱ
ȱȱřŘȱȱȱ
§ȱȱŝǰȱŚřǰȱŘŘŚȱȱȱ ȱǻǼȱȱȱȱŗŜŚȱ ȱȱȱŘŘśȱ ȬȬȱȱŘřŞȱȱȱ keyȱȱśřǰȱşřȱȱȱ
ȱȱ¢ȱȱŜřȱȱȱ
ȱȱȱ ȬȱȱŘŘŚȱ
£ȱȱȱȱŗŞȱȱ ȱȱȱȱřŘŗȱ
ȱôȱȱřŘŘȱ
ǰȱ ȱȱȱŗřśȱ
Ȃȱȱȱŗřśȱ
ȱȱśŜȱȱȱ
ȱȱŗŞŗȱ
£Ȭȱȱşřȱȱ
Stichwortverzeichnis
ȱȱŘŖŜȱȱ ȱȱȱŘŖŜȱȱ ȱȱȱŘŖŜȱȱȱ ¡ȱȱȱŗŜŘȱȱȱ
¡§ȱȱŗŖǰȱŗŘǰȱŚŗǰȱśşǰȱŝŚǰȱŗśřǰȱŗśśǰȱŘŖŞǰȱ ŘřŚǰȱřŗŝȱȱ ȱȱǻ ǼȱȱŘŗȱ ȱ ȱȱŗŘȱȱ
ȱȱŘşǰȱřŘȱȱȱ ¡ȱ ûȱȱŗśȱ
ȱȱŗŘŝǰȱŗřŜȱ
ȱȱŗŖȱȱȱ
ǰȱȱ ȱȱŗşȱ
ǰȱ ȱȱȱśŗȱȱ
ȬȱȱŚŞǰȱŞřȱ
L ¢ȱȱŘŘŞȱ §ȱȱȱȱŘŚŖȱȱȱ §ȱȱȱȱŘŝǰȱŘŚŖȱȱȱ §ȱȱȱȱŘŚśȱ £ȱȱŗŚȱ £ǰȱ ȱȱȱŗŗŚȱ lengthȱȱŞśǰȱŗŜŖǰȱŘŖşǰȱŘŝŝȱȱȱ ǰȱȱȱŘşŞȱ Ȭ£ȱȱŘşŞȱ ¡ȱȱŘŝǰȱŝŞǰȱŗŝşǰȱŘŘŗǰȱŘŞŞȱ ȱȱȱŘřŜȱȱ ȱȱȱŗŖŜǰȱŗŗśȱ ListȱȱŚŗǰȱśŘǰȱŜŖǰȱşŗǰȱŗŚŝǰȱŗśŚȱ ListIteratorȱȱśŚǰȱŜŗǰȱşŗǰȱŘŚşȱ listIteratorȱȱśśǰȱŜŗǰȱşŘǰȱŘŚşȱ LocaleȱȱŚŗǰȱśřǰȱŗŘŚȱ ȱȱȱŘŗǰȱŞŘȱ LongȱȱŗŘŖȱ Long.MAX_VALUEȱȱŘşśȱ ȱȱȱŝŜȱ ǰȱȱȱŗŚŞȱ ȬȱȱŘřŞȱȱȱ ȱǯǰȱ ãȱȱŗŚśȱ
M ǰȱ ȱȱŗŗśȱ
331 ȱȱȱŗŜşǰȱŗŝŝȱȱȱ ȬȬȱȱŗŘŖȱȱȱ ȱȱȱȱŝȱ Map.EntryȱȱśŚǰȱŜŖǰȱşŗȱ Math.absȱȱŗŝŚǰȱŗŞŗǰȱŗşŖǰȱŘŝŝȱ Math.cosȱȱŗŜśȱ Math.maxȱȱśŚǰȱşřȱ Math.minȱȱśřǰȱşřǰȱŗřŗǰȱŗřřȱ Math.PIȱȱŗŜśȱ Math.powȱȱŘŞşȱ Math.randomȱȱŞśȱ Math.roundȱȱŘřŞȱ Math.sinȱȱŗŜśȱ Math.sqrtȱȱŗřŞǰȱŘŞşȱ maxȱȱśŚǰȱşřȱ ¡ȱȱȱȱŘŜȱ ȱȱřřȱȱȱ £ȱȱŘřŘȱȱ ûȱȱŘŖȱȱ ȱȱŗŚŜǰȱŗśśȱ ȱȱŜŝǰȱŘşŝȱ ȬȱȱŘşŞȱ minȱȱśřǰȱŗřŗǰȱŗřřȱȱȱ ȱȱȱŘŞŜȱȱȱ ȱȱȱŚşǰȱŝŜȱ ȱȱȱȱŗřŜȱ ȱȱȱȱȱŗŘȱ modPowȱȱŗŗŗȱ ȱȱŝśȱ Ȭ £ȱȱśŘǰȱŞřȱȱȱ ȱȱ£ȱȱŘşŗȱȱȱ ȱȱŘşřȱȱȱ
N ȬȱȱŝŞȱ ûȱȱȱřřǰȱŚŗȱ ǰȱ£ǰȱǯȱȱŗŜşȱ ȬȬȱȱŗŜşȱȱȱ ȬȱȱȱŘśȱȱȱ nextȱȱśśǰȱŜŖǰȱŘŗşȱ nextBooleanȱȱŞśȱ nextClearBitȱȱŞŝȱ nextDoubleȱȱśŘǰȱŗŘŚǰȱŗśŘǰȱŗŜŜȱ nextFloatȱȱŚŘǰȱřŖŞȱ
332 nextIntȱ ȱ řŖǰȱ řśǰȱ ŚŚǰȱ Śŝǰȱ ŜŖǰȱ ŗŗŖǰȱ ŗŗŜǰȱ ŗŘŘǰȱ ŗřşǰȱŗŚŝǰȱŗśŚǰȱŗŝŚǰȱŗŞŜǰȱŗşŖǰȱŗşŘȱ nextLongȱȱŗŖŞǰȱŗŗřǰȱŗŗşǰȱŗŘŘǰȱŗŘŜǰȱŘŞŚȱ ȱ ȱ ǻǼȱ ȱ ȱ ŗŖŜǰȱ ŗŘśȱ ȬȱȱŘŗȱ Ȭ§ȱȱŗşǰȱŝŗȱ ȬûȬȱȱŗŝŞȱ NullPointerExceptionȱȱřřȱȱȱ
O ȱȱȱŗřȱ ȱ ǻȱ Ǽȱ ȱ ȱ ŗŖŜǰȱ ŗŘśȱ Ȭȱȱŗřȱ §ȱȱŗśǰȱŘřŗȱȱȱȱ §£ȱȱŘřŗȱ ȱȱŗŞȱ ȱȱŗşŜȱȱȱ [ȱȱŞȱ ȱȱřŘȱȱȱ ȱȱřŘȱ
P packȱȱŗřŗǰȱŗřŚǰȱŗŚŖȱ paintȱȱŗřŗǰȱŗřřǰȱŗřŞȱ parseIntȱȱşřȱ ȱȱûȱȱȱŗŞŘȱȱȱ ȱãȱȱŘŚŚȱȱȱ ȬȱȱŘśȱȱ ǰȱ ȱȱşşȱȱȱ ȱ¡ȱȱşşȱȱȱ ȱȱŘśǰȱŜŝǰȱŝŝȱȱȱ ȱǻƋǼȱȱŗŗŚǰȱŗŜśȱȱȱ ǰȱȱǻǼȱȱŘřŜȱȱȱ Ȭȱȱŗśřȱ Ȭȱȱŗśŝȱ ¢ȱȱŘŞŜȱȱȱ ¢ȱřŘȱȱȱ ¢ȱȱŗŜřǰȱŘŞŘǰȱřŗŖȱ positionȱȱŘŚŘȱȱȱ £ǰȱȱȱŗŖŝȱȱȱ £ǰȱȱȱŗŖŞȱ
Grundlegende Algorithmen mit Java £ȱȱřŗŗȱȱ powȱȱŘŞşȱȱ §¡ȱȱśŜȱȱȱ ȬȱȱȱŗśŞȱ previousȱȱŘŚşȱ £ȱȱřŘŗȱȱȱ £ȱȱřǰȱŗŖŗȱ printȱȱřŗǰȱřŜǰȱŚŗǰȱŚŘǰȱŚśǰȱŜŘȱ printfȱȱŚŞǰȱśŚǰȱşŚǰȱŗŗŜȱ printlnȱȱřŗǰȱřŜǰȱŚŘǰȱŚŞǰȱśŚǰȱŗŗŖǰȱŗŗřȱ printStackTraceȱȱřŗǰȱřŚȱ PrintStreamȱȱŚśǰȱŚŝǰȱŜŖǰȱşřǰȱŗŗŖǰȱŗŗřȱ PrintWriterȱȱřŖǰȱřśȱȱ ȱȱȱûȱȱȱȱȱȬ ȱȱŗŝşȱȱȱ ȱȱȱûȱȱȱ ȱȱȱȱŗŞŖȱ ¡ȱȱŘşŘȱ putȱȱśŘǰȱśŚǰȱŜŖǰȱşŗǰȱŘŚŘǰȱŘŝŘȱȱȱ
Q Ȭ§ȱȱŗśŝȱȱȱ ȬȱȱŘřŞȱȱȱ ȱȱŗŘŝǰȱŗśŞȱ ȱȱȱȱŗŖŜȱ ȱȱŗŚŜǰȱŗśŘȱ
R ȱǻȱȱǼȱȱŗŗȱ RandomȱȱŞŚȱ randomȱȱŞśȱ ûȱȱȱŗŚŗȱ ȱȱŗŜŘȱ ȱȱŗśŘȱȱȱ ȱȱŗŖśȱ ȱȱŗśȱȱȱ ȱȱȱŗŝȱ ȱȱşşȱ ȱȱŘŜŞǰȱřŗřȱ ȱȱŘŜŞǰȱřŗřȱ ȱȱȱŗŖśȱ ȱ ȱȱŗŘŖȱ ȱ£ȱȱŗŖŝȱ
Stichwortverzeichnis removeȱȱśśǰȱŜŗǰȱŗŝŝǰȱŘŗŖȱ replaceȱȱřŖŘȱȱȱ ȱđȱ£ȱȱŗŗŗȱ £ȱȱŜȱ roundȱȱŘřŞȱȱȱ ȱȱŘŖǰȱŚŖȱ §ȱȱŘŘȱȱȱ
S ȱȱŘŖȱ £ȱǻĘǰȱ£ǼȱȱŘŚŖȱȱȱ £ȱȱȱǻȱǼȱȱŗŘřǰȱŘŞŘȱ ScannerȱȱřŖǰȱřśǰȱŚŗǰȱŚŚǰȱŚŝǰȱśřǰȱŜŖǰȱŗŖŞȱ ȬȱȱŗŖǰȱŘŖȱ ȱȱȱȱƸŗȱȱşşȱȱ ȱ£ȱȱŗŖŞȱ ȱ ȱ ȱ ȱ ȱ ȱȱ ŗśȱ ȱȱȱȱȱŘŜŜȱ §ȱȱȱȱȱŗŚřȱ £ȱȱǻ¢Ȭ £ȬǼȱȱŗŖŘȱ SetȱȱŘŖŗȱ setȱȱŞŝǰȱŘŖřȱ setDefaultCloseOperationȱȱŗřŗǰȱŗřŚȱ setLocationȱȱŗřŚǰȱŗŚŖȱ setPrefferedSizeȱȱŗřŗǰȱŗřŚǰȱŗŚŖȱ setVisibleȱȱŗřŗǰȱŗřŚǰȱŗŚŖȱȱ ȱȱȱȱřȱȱȱ ȬȱȱŗŚŖȱ sizeȱȱŜŖǰȱşŖǰȱŗŚŝǰȱŘśśȱ ȱȱȱȱȱȱȱřřŚȱ sortȱȱřŖǰȱřřǰȱŚŖǰȱŚŘȱ ȱŘŝȱ ȬȱȱȱŗŚŗȱ ȱȱŚşȱȱȱ ȱȱȱȱŗŖŜȱ ȱȱȱȱȱŚśǰȱŗŞŞǰȱŘŝśȱ sqrtȱȱŗřŞǰȱŘŞşȱ ȱȱ ȱȱřřǰȱȱŘśśǰȱŘŞşȱ ȱȱȱȱşŞȱ ãȱȱ¢ȱȱřŖşȱ StringȱȱŚŗǰȱŚŚǰȱŚŜǰȱśřǰȱŜŖǰȱŗŗŖȱ StringBufferȱȱřśȱ
333 StringBuilderȱȱřŗǰȱřśǰȱŗŗŖǰȱŗŜŖǰȱřŖŗȱ substringȱȱřŖŘȱ ȱȱŘŗŚȱ ȱ£ ȱ£ȱȱŗŘřȱȱȱ ȱȱȱȱŘŞŖȱ ȱȱŗŜǰȱŗŖŖǰȱŗŖŚǰȱŗŝŝȱȱȱ ȱȱȱŗŞśȱȱȱ ȱȱŝŞȱ ¢ȱ ȱȱŝǰȱŞȱ ¢ȱȱŜŝǰȱŗŘşȱ System.inȱȱŗŝŚǰȱŗŞřǰȱŗŞŜǰȱŗşŖǰȱŘŜşȱȱ
T ȱȱŗŖŗǰȱŗŖśǰȱŗşşȱ ȱȱȱ£ȱȱŗŖŗȱ ȱȱŗśşȱ ȱȱŘŗŚȱ ȱȱ ȱȱŗŚśȱȱȱ ȱŗŖŗǰȱŗŖśǰȱŗşşȱ ȱȱŘŚśȱ ȱȱŗŚśǰȱŘřŗȱȱȱ ȱȱŘŖśȱ ThrowableȱȱřŗǰȱřŚȱ ȱȱŜȱ ToolkitȱȱŗřŗǰȱŗřŚȱ Ȭ Ȭ£ȱȱŘřŚȱ toStringȱȱŚŖǰȱŚřǰȱŗŘŗǰȱŗŜŜǰȱŘśśȱ ȱȱŝȱ ȱȱŜŜȱ £ȱȱŗśŖȱ ȱȱȱǻǼȱȱŗŞȱȱ TreeMapȱȱśŘǰȱŜŖǰȱşŗȱ ȱ ȱ ¡ȱ ¢ȱȱ ŘŞŜȱȱȱ ȬȱȱŘřŞȱ tryȱȱřŖǰȱřŚǰȱdzǰȱŗŗŖȱ ȱ ȱ ȱ ǯȱ §ȱȱ ŜŚȱȱȱ ûȱȱ ȱȱŗŖśǰȱŗŚŞȱȱ
U ûȱȱȱřŘȱ ûȱȱȱřŘȱ
334 tȱȱȱȱŘřŘȱ ûȱȱȱŗŚȱ ȱȱȱŗřȱȱȱ ȱȱŚŞȱ £§ǰȱ ȱȱŚşȱ useLocaleȱȱŚŗǰȱśřǰȱŗŘŚǰȱŗśŘȱ
V valueȱȱśřǰȱşřȱ ȱȱřŘŖȱȱȱ ȱȱŘŖȱ ȱȱȱŗŖŜǰȱŗŗŞȱȱȱ ȱȱȱŘśȱ £ȱȱśŝȱ ȱȱȱŘŘşȱ ȱȱ ȱȱŘśŞȱȱ £ ȱȱȱŗŖŜǰȱŗŘřȱȱȱ ȱȱřŘŗȱȱ ǰȱȱȱǯȱȱřŘŗȱȱȱ ȱȱǻ£ȱȱǼȱȱŗŘřǰȱŘŞŘȱȱȱ §ȱȱȱşşȱȱ §ȱ§ȱȱśŜȱ §ȱ ȱŝśȱȱ
Grundlegende Algorithmen mit Java ȱȱśŜȱ ȱȱśŝȱ ȱȱŗŗȱȱȱ ȱȱŗşŞȱ §ȬãȬȱȱŝřȱ £§ǰȱ ȱȱŚşȱ ȱȱŜȱ ȱȱŜŞȱȱȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ ȱ
W ȱȱǻǻǼǼȱȱŗŝȱ ȱȱŘŜŞȱȱȱ ȱȱŚşȱ ȱȱȱȱđȱȱŗŚŚȱȱȱ ȬȱȱŚŜȱ ȱȱŘŜǰȱŘŚŖȱ widthȱȱŗřŗǰȱŗřřǰȱŗřŞȱ WindowConstantsȱȱŗřŗǰȱŗřŚȱ Ȭȱ¡¢ȱȱŗŚȱȱȱ Ȭ ȱȱŗŘŖȱȱ ȱȱû£ȱȱŘŜŜȱ ££ȱȱȱȱŗŘřǰȱŘŞŘȱ
Z ȬȱȱŘŚşȱȱȱ ¢ȱȱŗŘŖȱȱȱ ǰȱȱȱŗŘŖȱȱȱ
ȱ
ȱ ȱȱȱȱȱȱ