ebook img

Entwurf und Analyse von Algorithmen PDF

549 Pages·2018·5.72 MB·German
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Entwurf und Analyse von Algorithmen

Studienbücher Informatik Markus Nebel Sebastian Wild Entwurf und Analyse von Algorithmen Eine Einführung in die Algorithmik mit Java 2. Auflage Studienbücher Informatik Reihe herausgegeben von W. Hower, Albstadt-Ebingen, Deutschland Die Reihe Studienbücher Informatik wird herausgegeben von Prof. Dr. Walter Hower. Die Buchreihe behandelt anschaulich, systematisch und fachlich fundiert Themen inner- halb einer großen Bandbreite des Informatikstudiums (in Bachelor- und Masterstudien- gängen an Universitäten und Hochschulen für Angewandte Wissenschaften), wie bspw. Rechner-Architektur, Betriebssysteme, Verteilte Systeme, Datenbanken, Software-En- gineering, Interaktive Systeme, Multimedia, Internet-Technologie oder Sicherheit in Informations-Systemen, ebenso Grundlagen und Operations Research. Jeder Band zeichnet sich durch eine sorgfältige und moderne didaktische Konzeption aus und ist als Begleitlektüre zu Vorlesungen sowie zur gezielten Prüfungsvorbereitung gedacht. Weitere Bände in der Reihe http://www.springer.com/series/12197 Markus Nebel · Sebastian Wild Entwurf und Analyse von Algorithmen Eine Einführung in die Algorithmik mit Java 2., vollständig überarbeitete Auflage Markus Nebel Sebastian Wild Universität Bielefeld University of Waterloo Bielefeld, Deutschland Waterloo, ON, Kanada ISSN 2522-0640 ISSN 2522-0659 (electronic) Studienbücher Informatik ISBN 978-3-658-21154-7 ISBN 978-3-658-21155-4 (eBook) https://doi.org/10.1007/978-3-658-21155-4 Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detail- lierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. Springer Vieweg © Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2012, 2018 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung, die nicht ausdrücklich vom Urheberrechtsgesetz zugelassen ist, bedarf der vorherigen Zustimmung des Verlags. Das gilt insbesondere für Vervielfältigungen, Bearbeitungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Der Verlag, die Autoren und die Herausgeber gehen davon aus, dass die Angaben und Informationen in diesem Werk zum Zeitpunkt der Veröffentlichung vollständig und korrekt sind. Weder der Verlag noch die Autoren oder die Herausgeber übernehmen, ausdrücklich oder implizit, Gewähr für den Inhalt des Werkes, etwaige Fehler oder Äußerungen. Der Verlag bleibt im Hinblick auf geografische Zuordnungen und Gebietsbezeichnungen in veröffentlichten Karten und Institutionsadressen neutral. Gedruckt auf säurefreiem und chlorfrei gebleichtem Papier Springer Vieweg ist ein Imprint der eingetragenen Gesellschaft Springer Fachmedien Wiesbaden GmbH und ist ein Teil von Springer Nature Die Anschrift der Gesellschaft ist: Abraham-Lincoln-Str. 46, 65189 Wiesbaden, Germany Vorwort Vorwort zur 2. Auflage Die wesentliche Geschichte zur Entstehung dieses Buches habe ich bereits im Vorwort zur 1. Auflage erzählt. Seit deren Erscheinen im Jahr 2012 diente das Buch jährlich als Grundlage der gleichnamigen Vorlesung an der Technischen Universität Kaiserslautern. Über die Zeit erhielt ich so vielfältiges Feedback, einige Fehler wurden entdeckt, aber auch Wünsche an mich herangetragen. Insbesondere die Bitte nach der Verwendung von Java anstelle der an Pascal bzw. Modula-2 angelehnten Modell-Programmiersprache der ersten Auflage wurdeimmerlauter.AlsichimJahr2016andieUniversitätBielefeldwechselte undseitdemdortAlgorithmenundDatenstrukturenbereitsimerstenSemester parallelzurProgrammierausbildung(unterandereminJava)unterrichte,stand mein Entschluss fest: Sollte es eine zweite Auflage geben, so müsste diese entsprechend überarbeitet werden. DochwarumnichteinfachaufeinesdervielenanderenWerkezurückgreifen, die entsprechende Inhalte im Kontext von Java diskutieren? Auch diese Frage habe ich mir vielfach gestellt und mit meinem damaligen Doktoranden Sebastian Wild diskutiert. Wir sind letztlich zu der Überzeugung gekommen, dass das vorliegende Werk einige Besonderheiten besitzt, auf die ich für meine eigene Lehre auch in Zukunft nicht verzichten möchte. So waren Herr Wild und ich uns letztlich einig, dass es die Mühe wert sei, das Buch komplett zu überarbeiten, und ich bin froh, dass er mich dabei als Koautor massiv unterstützt hat. Dabei haben wir neben der ursprünglich geplanten Übersetzung der Code- beispiele zu Java die Gelegenheit ergriffen, auch unzählige Detailpolituren vorzunehmen. Wir haben in der Überarbeitung den Charakter der ersten Auflage beibehalten: Wir präsentieren die Inhalte in einer induktiven Art und Weise, bei der wir ausgehend von einer ersten Lösungsidee, unter Verwendung von Beispielen Erkenntnisse über das behandelte algorithmische Problem erarbeiten, mit deren Hilfe wir dann zu einer verbesserten Lösung gelangen. Wir zeigen so auf, wie in der Praxis gute Algorithmen iterativ entstehen v vi Vorwort können, anstatt eine fertige Lehrbuchlösung vom Himmel fallen zu lassen, bei der sich Studierende oft fragen, wie man denn auf diese selbst nur kommen soll. Für unsere Beschreibungen und Definitionen verwenden wir auch weiterhin viel mathematische Formelsprache. Die damit einhergehende Präzision ist ein großer Vorteil: sie beugt Missverständnissen vor, erlaubt formale Beweise und gestattet es nicht zuletzt dem Studierenden, sich am Formalisieren zu üben–auchwennundgeradeweildaseinetypischeHürdefürStudienanfänger darstellt. Wo möglich, leiten wir in den Analysen exakte Ergebnisse her und geben nicht nur Schranken in asymptotischer Notation an. Die dafür teils notwendigen längeren Rechnungen werden in allen Details dargestellt und bleiben so einfach nachvollziehbar. Entsprechend legen wir auch die meisten Beweise in allen Details dar und begnügen uns nicht nur mit Skizzen. Insgesamt bietet das Buch so dem Studierenden eine Möglichkeit, entspre- chendeformaleKonzeptezuerlernen.DabeiistdasnatürlichkeinSelbstzweck; es ist eine Kernkompetenz, die etwa bei der Arbeit an immer komplexeren SoftwaresystemenfürdiepräziseSpezifikationvonSchnittstelleneinengroßen Gewinn darstellt. Aus praktischer Sicht unterscheidet sich der vorliegende Text darin von etlichen anderen Werken, dass meist ausführbarer Java- anstelle von Pseu- docode benutzt wird, um die behandelten Algorithmen zu beschreiben. Die Breite der behandelten Inhalte ist unverändert geblieben, wenige Themen wie Approximation, randomisierte Algorithmen oder das Lineare Programmieren werden dabei mit dem Ziel kurz angerissen, einen Ausblick zu liefern, was die Algorithmik neben den hier vertieft behandelten Inhalten sonst noch zu bieten hat. BeiderÜberarbeitungwarendieErfahrungenausdemlangjährigenEinsatz der ersten Auflage als Begleitbuch zur Vorlesung „Entwurf und Analyse von Algorithmen“ an der TU Kaiserslautern unerlässlich. Unser Dank gilt allen Betreuern, Tutoren und Hörern der Vorlesung, die geholfen haben, Unklarheiten aufzudecken und Verbesserungsvorschläge zu dokumentieren; in besonderemMaßehatsichRaphaelReitzigumdieVerbesserungderVorlesung und dieses Buches verdient gemacht. Bielefeld im Dezember 2017 Markus E. Nebel Waterloo im Dezember 2017 Sebastian Wild Vorwort vii Vorwort zur 1. Auflage Kenntnisse über effiziente Algorithmen und Datenstrukturen sind eine der zentralen Voraussetzungen für die Entwicklung leistungsfähiger Programme. Insofern ist es wichtig, für grundlegende Probleme der Informatik gute al- gorithmische Lösungen zu kennen und zu verstehen, wie diese zu Lösungen komplexerer Aufgaben kombiniert werden können. Entsprechend behandelt dieses Buch – wie für Lehrbücher zu diesem Themenkomplex üblich – eine Vielzahl bekannter Datenstrukturen und Algorithmen zu so elementaren Auf- gaben wie das Sortieren von Daten, das Unterhalten eines Wörterbuchs und vielemehr.DochnichtfüralleProbleme,denenwirinunsererberuflichenoder akademischenPraxisbegegnen,gelingteineLösungnurausbereitsbekannten Bausteinen;indiesemFallistderWegzueinemAlgorithmusdeutlichsteiniger. ÜberdieJahrehabensichjedochverschiedeneHerangehensweisen–Entwurfs- methoden genannt – bewährt, mit deren Hilfe die Auseinandersetzung mit einem neuen Problem strukturiert und entlang vorgezeichneter Pfade erfolgen kann. Auch solche Konzepte werden wir behandeln. Mit diesem Standardinhalt themenverwandter Werke wäre der im Titel ge- nannte Entwurf von Algorithmen abgedeckt. Doch in diesem Buch wollen wir weitergehen,unddiesausgutemGrund.StehenunsverschiedeneAlgorithmen (und/oder Datenstrukturen) zur Lösung desselben Problems zur Verfügung – und das ist eigentlich der Regelfall – für welchen sollen wir uns entscheiden? Sie werden mir sofort begegnen „Natürlich für den Besten“, doch genau da fängt die Crux an, denn es ist keinesfalls offensichtlich, wie wir die Güte einer Lösung bewerten sollen. Aus diesem Grunde ist ein zweiter, wesentlicher Aspekt der Abhandlung in diesem Buch die Analyse von Algorithmen und Datenstrukturen und die dafür notwendigen mathematischen Methoden. Die dabeierzielenErgebnissegestattenesunsnichtnur,verschiedeneAlgorithmen miteinander zu vergleichen, sie liefern uns auch Einsichten, warum bestimmte Lösungen nicht besser sein können als sie es sind und zeigen uns auf, welche Änderungen am Algorithmus notwendig werden, um seine Leistungsfähigkeit zu steigern. Bei all diesen Betrachtungen findet der sog. Average-Case, d.h. eine Betrachtung der gemittelten Kosten unter Annahme einer möglichst realistischen Verteilung der Eingaben, in diesem Buch besondere Berücksich- tigung. Dies trägt dem Umstand Rechnung, dass die üblicherweise für den Vergleich von Algorithmen herangezogene Betrachtung des schlechtesten Falls (Worst-Case) aus Sicht der praktischen Anwendung oft ein verzerrtes Bild zeichnet, da er meist höchst unwahrscheinlich ist und in der Praxis entspre- chend kaum vorkommt. Bei alledem lassen wir Details der Implementierung nichtaußerAcht,dennauchdiesekönnenfürdieEffizienzunddamitfürunsere Analyse wesentlich sein. Entsprechend präsentieren wir neben den genannten theoretischen Betrachtungen meist auch eine ausformulierte Implementierung der Algorithmen und Datenstrukturen. An diesem Punkt könnte man eigentlich zufrieden sein, wäre da nicht ein Dorn im Auge der Informatik: Nicht für alle Probleme existieren effiziente viii Vorwort Lösungen, ja es ist sogar möglich, dass wir einem Problem begegnen, für das einComputergarnichtinderLageist,eineLösungzuberechnen,unabhängig davon, wie viele Ressourcen (Zeit, Platz) wir ihm dafür zur Verfügung stellen. Für den studierten Informatiker ist es wichtig, sich der Existenz solcher Situa- tionen bewusst zu sein und entsprechende Probleme zu erkennen. Deshalb rekapitulieren wir essentielle Erkenntnisse aus dem Bereich der Algorithmen- theorie (eine weiterführende Betrachtung würde den Rahmen sprengen und ist Gegenstand unseres Lehrbuchs Formale Grundlagen der Programmierung [20]), und behandeln ausführlich das Thema der sog. NP-Vollständigkeit. Letzteres ist ein Konzept der theoretischen Informatik, das Einsichten in die Welt der (vermutlich) “nicht effizient lösbaren” Probleme liefert. Wir beschließen das Buch mit einer Betrachtung verschiedener Methoden, mit deren Hilfe wir versuchen können, uns solchen Problemen dennoch zu stellen. * * * Dieses Werk ist über viele Jahre gewachsen und hat seinen Ursprung in der Vorlesung „Theoretische Informatik 1“, die ich im Wintersemester 2003/2004 an der Universität Frankfurt gehalten habe. Damals konnte ich die entspre- chenden Vorlesungs-Skripte von Prof.Dr. Rainer Kemp sowie von Prof.Dr. GeorgSchnitgerundMaikWeinardalsVorlagenverwendenundderenInhalte nach meinen Vorstellungen ergänzen und kombinieren. Seit meinem Wechsel an die Technische Universität Kaiserslautern im Jahr 2005 halte ich dort regelmäßig die inhaltlich verwandte Vorlesung „Entwurf und Analyse von Algorithmen“. Entsprechend entwickelte ich das Material weiter und Inhalte wie die String-Algorithmen und die Komplexitätstheorie wurden ergänzt. Die zahlreichenunddurchwegpositivenRückmeldungenmeinerStudentinnenund Studenten zum letztlich so entstanden Manuskript haben mich schließlich dazu bewogen, das Ganze – nach einer erneuten Überarbeitung – als Buch zu veröffentlichen. Herausgekommen ist ein Werk, das im Umfang sicher die in einer einzelnen Vorlesung vermittelbare Stoffmenge übersteigt. Es ist jedoch einfach möglich, eine sinnvolle Stoffauswahl zu treffen und dabei unterschied- liche, der Hörerschaft angepasste Akzente zu setzen. Alle Kapitel sowie die zugehörigen Aufgaben sind dabei so gehalten, dass sie im Bachelor-Bereich unterrichtet werden können. Auch kann das gesamte Werk problemlos für ein autodidaktisches Studium herangezogen werden und interessierte Studierende können so die in einer Vorlesung nicht behandelten Kapitel oder Sektionen eigenständig erarbeiten. Selbstverständlich hatte ich auch Unterstützung bei der Erstellung dieses Buches, und ich möchte nicht versäumen, den beteiligten Personen (in chrono- logischer Reihenfolge ihrer Beiträge) zu danken. Es sind dies mein Lehrer und Mentor Prof. Dr. Rainer Kemp, der inzwischen leider verstorben ist, sowie Prof. Dr. Georg Schnitger, denen ich für die Unterstützung bei der Erstellung der Urform dieses Werkes sowie letztgenanntem für der Überlassung mancher Materialien danke. Herrn Uli Laube gilt mein Dank für die Erzeugung ver- schiedenerGrafiken.FrankWeinbergundHannahFudeustrugenwährendder Vorwort ix Betreuung meiner Vorlesungen in Kaiserslautern dazu bei, manchen Fehler zu entdecken und ersannen Übungsaufgaben zu dem Stoff. Als letztes möchte ich Herrn Prof. Dr. Walter Hower danken, der als Herausgeber dieser Reihe die fast finale Form des Buches Korrektur las. Allen Studenten wünsche ich viel Vergnügen beim Studium dieses Werkes, den notwendigen Fleiß, um den behandelten Stoff zu vertiefen, und letztlich viel Freude an den dabei gewonnenen Erkenntnissen und ihrer Anwendung. Allen Dozenten wünsche ich, dass ihnen das vorliegende Buch eine Hilfe dabei sein möge, den spannenden Stoff zum Entwurf und der Analyse von Algorithmen zu unterrichten, und letztlich dieselbe Freude die ich verspüre, wenn ihn meine Studentinnen und Studenten schließlich verinnerlicht haben. Kaiserslautern im April 2012 Markus E. Nebel

Description:
Effiziente Algorithmen und Datenstrukturen haben sich in den letzten Jahrzehnten selbst bei der Lösung aussichtslos erscheinender praktischer und theoretischer Probleme bewährt. Dieses Buch führt in die Algorithmik mit Java ein und präsentiert dafür eine Sammlung grundlegender Algorithmen und D
See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.