Grundlagen der Informatik Wolfgang Ertel WS 2005/06 Inhaltsverzeichnis 1 Was ist Informatik? 1.1 Informatik . . . . . . . . . . . . . 1.2 Computer . . . . . . . . . . . . . 1.3 Information . . . . . . . . . . . . 1.4 Teilgebiete der Informatik? . . . . 1.5 Programm, Algorithmus, Software 1.6 Betriebssysteme . . . . . . . . . . 1.7 Softwaretechnologie . . . . . . . . 1.8 Datensicherung . . . . . . . . . . 1.9 Datensicherheit . . . . . . . . . . 1.10 Datenschutz . . . . . . . . . . . . 1.11 Datenbanken . . . . . . . . . . . 1.12 Das Informatikstudium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Geschichte der Informatik 2.1 Wichtige Quellen . . . . . . . . . . . . . 2.2 Geschichte der Zahlen und des Rechnens 2.3 Zahlendarstellung . . . . . . . . . . . . . 2.4 Geschichte der Bauelemente . . . . . . . 2.5 Geschichte der Rechenmaschinen . . . . 2.6 Geschichte der Programmiersprachen . . 2.7 Geschichte des Internet . . . . . . . . . . 2.8 Große Informatiker . . . . . . . . . . . . 2.9 Frauen in der Informatik . . . . . . . . . 2.10 Wichtige Institute und Firmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 4 5 5 6 6 8 10 11 12 12 13 . . . . . . . . . . 14 14 14 14 16 18 25 26 28 34 36 3 Endliche Automaten 37 3.1 Endliche Automaten zur Worterkennung . . . . . . . . . . . . . . . . . . . . . . 37 3.2 Automaten mit Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.3 Formale Beschreibung von Automaten . . . . . . . . . . . . . . . . . . . . . . . 38 4 Sortieralgorithmen 4.1 Sortieren durch Einfügen . . . . . 4.2 Quicksort . . . . . . . . . . . . . 4.3 Sortieren mit Bäumen (Heapsort) 4.4 Sortieren in linearer Zeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 41 46 51 56 5 Algorithmen auf Graphen 58 5.1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.2 Eulerkreise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 2 5.3 5.4 5.5 5.6 Datenstrukturen für Graphen . . . . Kürzeste Wege . . . . . . . . . . . . Das Problem des Handlungsreisenden Planare Graphen . . . . . . . . . . . 6 Übungen 6.1 Geschichte der Informatik 6.2 Endliche Automaten . . . 6.3 Sortieren . . . . . . . . . . 6.4 Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 62 65 72 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 73 73 74 76 7 Lösungen zu den Übungsaufgaben 7.1 Geschichte der Informatik . . . . 7.2 Endliche Automaten . . . . . . . 7.3 Sortieren . . . . . . . . . . . . . . 7.4 Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 79 79 80 83 . . . . . . . . . . . . Literaturverzeichnis 86 3 Kapitel 1 Was ist Informatik? 1.1 Informatik Definition 1.1 Informatik ist die Wissenschaft der automatischen Verarbeitung von In formationen mit Hilfe von Computern. (Am.: Computer Science) Verschiedene Aspekte der Informatik: • Spaß am Programmieren (Erfolgserlebnisse) • Spaß an der Beherrschung der Maschine • Teilweise sehr abstrakte Wissenschaft (Mathematik) • Ohnmachtgefühl von Laien 1.2 Computer k Definition 1.2 Programmierbare Rechenmaschinen werden als Computer bezeichnet. früher wurden Menschen, die “rechnen” als Computer bezeichnet. Computer • machen unser Leben bequemer • helfen beim Beschaffen von Informationen • vereinfachen die Kommunikation • können süchtig machen • können zum Pseudopartner werden • vernichten Arbeitsplätze • schaffen Arbeitsplätze • Wem nützt die Informatik? • Wem schadet die Informatik? ⇒ Soziale Verantwortung des Informatikers! 4 1.3 Information Information: Wissen, Gegenteil von Unsicherheit. Definition 1.3 Als elementare Maßeinheit für Information dient das Bit. Eine Nachricht (z.B. ein Text od. eine Zahl) hat einen Informationsgehalt von n Bit, wenn die minimale Zahl von Ja/Nein Fragen, zur exakten Ermittlung der Information genau n ist. Ein Computer-Wort besteht aus 8, 16, 32, oder 64 Bit. Beispiel 1.1 1 0 0 1 1 0 1 0 1 · 27 + 0 · 26 + 0 · 25 + 1 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20 = 128 + 16 + 8+ 2 = 154 1.4 Teilgebiete der Informatik? Informatik Theoretische Informatik • • • • • • • • Logik (logisch!) Berechenbarkeit (ist jedes Problem berechenbar?) Komplexität (Rechenaufwand) Formale Sprachen (Programmiersprachen) Informationstheorie (Datenübertragung) Kryptographie (Datensicherheit) Formale Spezifikation und Verifikation (Korrektheitsbeweise von Programmen) ... Technische Informatik • • • • • Hardware Rechnernetze Schaltungen Schnittstellen Peripheriegeräte Praktische Informatik Bereitstellen von Hilfsmitteln für die Arbeit mit Computern • • Rechnerarchitektur Betriebssysteme (DOS, Windows, Unix, . . . ) 5 • • • • • • • Datenbanken Künstliche Intelligenz Software-Entwicklung Datenkommunikation Prozeßsteuerung Bildverarbeitung ... Angewandte Informatik • • • • • • 1.5 Wirtschaftsinformatik Medizinische Informatik Medieninformatik (Multimedia) Kommunikationstechnik Automatisierungstechnik Künstliche Intelligenz Programm, Algorithmus, Software Definition 1.4 Algorithmus: Allgemeines Schema zur Lösung einer Klasse von Problemen. Programm: Folge von Befehlen in einer festen Programmiersprache Softwareentwicklung: • Problemanalyse • Problemlösung (Algorithmierung) • Programmierung (Kodierung) • Test • Inbetriebnahme Softwaretechnologie: Systematische Untersuchung der Softwareentwicklung und Bereitstellung von Entwicklungswekrzeugen. 1.6 Betriebssysteme 1.6.1 Betriebssysteme: Aufgaben • Laden u. Starten von Programmen • Verwalten des Hauptspeichers ◦ ◦ Schützen der Speicherbereiche von Programmen Verwaltung des virtuellen Speichers (paging, swapping) Paging: Auslagern von Programmteilen Swapping: Auslagern ganzer Programme 6 • Verwaltung von Dateien ◦ ◦ • Ein- und Ausgabe ◦ ◦ ◦ • Verwaltung von Dateiattributen (Größe, Datum, Rechte) Verwaltung von Verzeichnissen zeichenorientiert: Tastatur, Bildschirm, Drucker, serielle Schnittstelle blockorientiert: Festplatte, Diskette, CD-Rom, Streamer Verwaltung von Warteschlangen, z.B. f. Drucker Zeitgeberfunktionen: Datum, Uhrzeit, verzögerter Programmstart 1.6.2 Betriebssysteme: Bestandteile Betriebssystemkern: (Kernel) allgemeine Module f. Ein/Ausgabe, Speicherverwaltung, etc. Dienstprogramme: kopieren, löschen v. Dateien, formatieren v. Disketten, ... Bootprogramme: zum Hochfahren des Rechners benötigte Programme ladbare Treiber: z.B. f. Netzwerkanbindung, Streamer 1.6.3 Betriebssysteme: Beispiel program tabelle(input,output); var tabelle : text; x, xmax : integer; begin open(tabelle, ...); rewrite(tabelle); write(’Gib Wert xmax ein:’); readln(xmax); writeln(tabelle,’ x | x^2 ’); writeln(tabelle,’------------’); Datei öffnen Dateizeiger z. schr. a. Anf. Bildschirmausgabe Zahl von Tastatur lesen auf Datei schreiben ” for x := 1 to xmax do begin writeln(tabelle,x:4, ’ | ’, x*x:4); ” end; close(tabelle); Datei schliessen, d.h. freigeben end. 7 1.6.4 Betriebssysteme: Vergleich Produkt CP/M MS-DOS MS-Windows 3.11 MS-Windows 95 MS-Windows 98 Windows NT OS/2 Novell/Windows Unix Linux VMS (Digital) VM/CMS (IBM) BS 2000 (Siemens) 1.6.5 PC Work- Mainstation frame X X X X X X X X X X X X X X X X . X X X X X X X X X X X X X UNIX Shellprogrammierung, ein Beispiel: #!/bin/tcsh ####!/usr/local/bin/tcsh # Control C causes a jump to interrupt: onintr interrupt start: while(1) # export latex $1 latex $1 if ($status == 0) then xdvi -geometry 750x880+0-0 -paper a4 -install $1 if ($status != 0) then echo "@@@@@@@@@@@@@@@@@@@@@@@ xdvi Fehler! @@@@@@@@@@@@@@@@@@@@@@@@@@@" exit endif endif end interrupt: set kbinput = "0" while($kbinput != "q") echo "|||||||| Drucken (lj5_t011): ’d [RETURN]’" echo "|||||||| Drucken (lj4mplus): ’2 [RETURN]’" echo "|||||||| Drucken (lj5m): ’farbig [RETURN]’" echo "|||||||| Drucken (lj5m): ’farbfolien [RETURN]’" echo "|||||||| Ghostview: ’g [RETURN]’" echo "|||||||| Latex: ’l [RETURN]’" echo "|||||||| Bibtex: ’b [RETURN]’" echo "|||||||| Exit: ’q [RETURN]’" set kbinput = $< if ($kbinput == "d") then dvips -o "\!lp -d lj5_t011" $1 else if ($kbinput == "2") then dvips2 $1 else if ($kbinput == "farbig") then dvips $1 -o "\!lp -d lj5m" else if ($kbinput == "farbfolien") then dvips $1 -o "\!lp -d lj5m -o tray2" else if ($kbinput == "b") then bibtex $1 else if ($kbinput == "g") then dvips $1 -o; ghostview -magstep -1 -a4 $1.ps; rm $1.ps else if ($kbinput == "l") then goto start endif end 1.7 multi multi Netzuser tasking anbind. Softwaretechnologie Kosten von Hard- und Software: Früher: 90% Hardware, 10% Software 8 X X X X ? X Heute: 10% Hardware, 90% Software ⇒ Informatik als Ingenieursdisziplin mit der Aufgabe der Softwareentwicklung! Definition 1.5 Beim Softwareengineering laufen folgende Prozesse parallel nebeneinander ab: Softwareentwicklung Projektmanagement Qualitätssicherung Projektverwaltung 1.7.1 Softwareentwicklung Wichtige Begriffe: • Softwarelebenszyklus (software life cycle) • Phasenmodell der Softwareentwicklung • Wasserfallmodell Planung Der Softwarelebenszyklus Spezifikation Entwurf Kodierung Test Betrieb Stillegung 1.7.2 Moderne Softwareentwicklung Wichtige Schritte im Entwicklungsprozess: Use Cases: Typische Benutzer-Programm Interaktionen 9 Verteilungsmodell: Verteilung von Objekten/Prozessen auf einzelne Rechner, bzw. teilnetze Datenflußdiagramm: Graphische Darstellung des Datenflusses. Führt zu Schnittstellendefinitionen. Beispiel 1.2 ps Prozeßliste sort sortierte Liste Unix-Pipe: ps | sort | lp lp druckbare Daten Drucker Ausdruck auf Papier 1.7.3 CASE: Computer Aided SW-Engineering CASE-Tools sind Werkzeuge, die teilweise automatisch den ganzen Entwicklungsprozeß unterstützen. 1.8 Datensicherung Definition 1.6 Datensicherung (engl. Dump) ist das regelmäßige Speichern von Daten von der Festplatte auf einen anderen Datenträger mit dem Ziel der Rekonstruktion bei Da tenverlust. klassisches Verfahren: inkrementeller Dump Level 0 Dump: 1× pro Monat wird die gesamte Platte (inklusive Betriebssystem) auf dem Magnetband gesichert. (in den ungeraden Monaten auf Band M-1, in den geraden Monaten auf Band M-2.) Level 1 Dump: 1× pro Woche werden die Benutzerdaten von der Platte auf dem Magnetband gesichert. (in den ungeraden Wochen auf Band W-1, in den geraden Wochen auf Band W-2.) Level 2 Dump: täglich werden die Benutzerdaten von der Platte auf dem Magnetband inkrementell gesichert. (in den ungeraden Wochen auf die Bänder Mo-1, . . . , Fr-1, in den geraden Wochen auf die Bänder Mo-2, . . . , Fr-2) 10 Bemerkungen: • insgesamt werden 14 Magnetbänder für die Datensicherung benötigt! • während des Dumps sollte kein Benutzer auf dem Rechner arbeiten. • die gesicherten Medien (Bänder) sollten in einem anderen Gebäude sicher verwahrt werden. modernes Verfahren: Daten werden monatlich, wöchentlich, täglich auf je eine monatliche, eine wöchentliche, bzw. eine tägliche Festplatte (im Wechsel) gespiegelt, nach ähnlichem Verfahren wie oben. 1.9 Datensicherheit Asymmetrische Kryptographie Verschlüsseln (E), Entschlüsseln (D) M E P (M) EP B B DS B M unsicherer Kanal Alice Bob Digitale Signatur M ES (M, ES (M)) A A DP M A Bob Alice 1.9.1 Speicherung des geheimen Schlüssels • auf der Festplatte des PCs • auf Diskette, CD, USB-Stick • auf Chipkarte • auf Chipkarte, berührungslos lesbar Problem: Big Brother is watching you! Beispiele: • RFID-Chips (RFID = radio frequency identification), teilweise schon in Alltagsgegenständen eingebaut • Ubiquitous Computing (allgegenwärtiger Computer) • • • • das Handy führt mich überall hin über das Handy bin ich immer lokalisierbar über das Handy kann ich immer gestört werden ... 11 1.10 Datenschutz Bundesdatenschutzgesetz (BGBL. 1 2003, S. 66) § 1, Abs. 1: “Zweck dieses Gesetzes ist es, den Einzelnen davor zu schützen, dass er durch den Umgang mit seinen personenbezogenen Daten in seinem Persönlichkeitsrecht beeinträchtigt wird.” Beispiel: Die Veröffentlichung von Fotos von Mitarbeitern ist nur erlaubt, wenn der Mitarbeiter freiwillig und schriftlich sein Einverständnis erklärt. 1.11 Eva Müller Mitarbeiterin des Monats Datenbanken Beispiele: • Literaturdatenbank • Personaldatenbank • Gefahrstoffdatenbank • Buchunssystem für Reisebüros/Fluggesellschaften • ... Definition 1.7 Eine Datenbank ist eine systematisch strukturierte, langfristig verfügbare Sammlung von Daten einschließlich der zur sicheren und schnellen Manipulation dieser Daten erforderlichen Software. Vorteile einer Datenbank: • Mehrbenutzerbetrieb möglich • Unterschiedliche Sichten auf die Daten sind möglich • Daten sind unabhängig von Nutzerprogrammen; Nutzung ist unabhängig von der Art der Speicherung. • Vollständigkeit (Integrität) und Korrektheit (Konsistenz) werden automatisch gewährleistet. Eine Datenbank besteht aus Datenbasis: die (z.B. als Tabellen) in Dateien gespeicherten Daten. Datenbankmanagementsystem (DBMS): Programm für Aufbau, Verwaltung und Anwendung der Datenbank. Datenbanksprache: formale Sprache zur Formulierung von Benutzeranfragen an die Datenbank. (Beispiel: SQL (Structured Query Language)) 12 1.12 Das Informatikstudium Leonardo da Vinci: Studium ohne Hingabe schadet dem Gehirn Der Studienerfolg wird statistisch u.a. bestimmt durch folgende Variablen: Schnitt falls Abitur Schnitt − 0.5 falls FH-Reife direkt Note: Note = Schnitt − 1 falls FH-Reife auf 2. Bildungsweg Interesse (für Informatik): Ich wollte schon immer wissen, wie (intelligente Roboter, Verschlüsselung, Internet, . . . ) funktioniert (0|1) Biss (Wille): Wenn nötig arbeite ich auch am Abend und am Wochenende (0|1) SozUm: Finanziell gesichert, Wohnen vor Ort, Partnerschaft o.k. (0|1) 1.12.1 Entscheidungsbaum Variablenwerte für Interesse, Biss, SozUm: 1: trifft voll zu; 0: trifft nicht oder nur teilweise zu Studienerfolg: −: keine Abschluss; +: Bachelor; ++: Bachelor, sehr gut Note >3 Biss 0 Biss 0 1 + <1.5 1.5-2.5 Interesse 2.5-3 1 0 1 + Biss Interesse 0 Interesse 0 0 1 0 1 + ++ + ++ SozUm 0 1 0 1 + Biss 0 + 1.12.2 1 + Score (einfach) Score = (3 − Note) + 3 · Biss + 2 · Interesse + SozUm ++ falls Score > 3.5 + falls Score > 0 Studienerfolg = − falls sonst 13 ++ SozUm Interesse 1 1 Kapitel 2 Geschichte der Informatik 2.1 Wichtige Quellen • http://de.wikipedia.org • www.computerhistory.org • F. Naumann, Vom Abakus zum Internet [2] • H. Matis, Die Wundermaschine[3] • W. de Beauclair, Rechnen mit Maschinen – eine Bildgeschichte der Rechentechnik[4] Viele der folgenden Informationen und Bilder stammen aus diesen Quellen. 2.2 Geschichte der Zahlen und des Rechnens 30000 v. Chr. erste Zeichensysteme für Zahlen in Ägypten und Mesopotamien 3500 v. Chr. Zeichen auf Tontafeln in Pakistan Additive Zahldarstellung in Rom, Mexiko (Maya), China, Ägypten, Sumerer 200 v. Chr Erfindung der Null in Indien ⇒ Stellenwertsystem 0 Römische Schriftzeichen 1200 Fibonacci führt negative Zahlen ein (Schuld) 2.3 Zahlendarstellung Additive Zahlendarstellung: 14 additiv (ohne Null) mit Null (binär) dezimal – 0 0 1 1 1 11 10 2 111 11 3 1111 100 4 11111 101 5 111111 110 6 1111111 111 7 11111111 1000 8 111111111 1001 9 1111111111 1010 10 ... ... ... 1111111111111111111111111111111111111111 110010 50 ... ... ... additive Zahlendarstellung ist für große Zahlen nicht brauchbar! Mit n Stellen lassen sich darstellen: additiv: die Zahlen 1 . . . n binär: die Zahlen 0 . . . 2n − 1 dezimal: die Zahlen 0 . . . 10n − 1 Ziffern 0 . . . b: die Zahlen 0 . . . bn − 1 Wieviele Stellen braucht man, um eine große Zahl z darzustellen? binär: z = 2n ⇔ n = log2 z allgemein: additiv: binär: dezimal: Ziffern 0 . . . b: Zahl d. Stellen um die Zahlen 0 . . . m darzustellen m+1 ≤ log2 m + 1 ≤ log10 m + 1 ≤ logb m + 1 Die Zahl der Stellen bei Stellenwertsystemen wächst nur logarithmisch mit der Größe der darzustellenden Zahl (dank der Null). 15 2.4 2.4.1 Geschichte der Bauelemente Rechenlogik Elektrische Rechenmaschine braucht elektrische Schalter! Mechanik Antike bis heute Relais 1835 – 1950, J. Henry Röhre 1904 – 1970, J.A. Fleming (Engl.) Transistor 1947 – heute, Bell Labs (USA) Integrierter Schaltkreis 1958, heute bis zu 1 Milliarde Transistoren auf unter 1 cm2 16 Pentium 4 2.4.2 Intel, 2000, bis 3.8 GHz Taktfrequenz, 2 CPUs auf einem Chip Speichertechnologie 1956, IBM-RAMAC • erste Festplatte • 50 Platten, je 60 cm Durchmesser, 1200 Umdr./min • pro Platte 2 × 100 Spuren mit je 500 Zeichen • ⇒ pro Platte 100 kB Speicher • gesamt: 5 MB Speicher 2.4.3 Speichertechnologie 2005 • 4 Gigabit pro cm2 • Spurabstand ≈ . . . • Köpfe fliegen 10-15 Nanometer über d. Platte 17 2.4.4 2.5 Speichertechnologie 1956–2005 Geschichte der Rechenmaschinen 2.5.1 Kerbhölzer und Knotenschnüre • Speicherung von Zahlen • Additition und Subtraktion 2.5.2 Mechanische Rechenmaschinen (Mittelalter) ???: Abakus +, − Schickard (1623, lange unbekannt): +, −, ×, / Pascal (1641): +, − 18 Leibniz (1675) +, −, ×, / Babbage (1823), Difference Engine Analytical Engine Die grundlegend neuen Ideen bestehen: 1. In der Programmierbarkeit einer Maschine durch Verwendung von Jacquard‘schen Lochkarten. 2. In der Weiterverwendung von Zwischenergebnissen. („the engine eating its own tail“) 3. Der Aufteilung des Gerätes in Speicher(Store) und Rechenwerk (Mill). Zahnstangen dienten der Übertragung von Zahlenwerten zwischen Store und Mill (Rechnerbus). Babbage Bis (1833–?), Analytical Engine John (pro1948 (Speicherprogrammierbarkeit, von Neumann) gibt es keine grundlegende grammierbar!) Weiterentwicklung dieses Konzepts! Die ersten „modernen“ Rechner hatten eine einfachere Architektur. Die Analytical Engine war ein Papiercomputer. Nur einzelne Komponenten (Teile des Rechenwerks) wurden wirklich gebaut. Informatikgeschichte, E. Ehses 2003 2.5.3 Der Abakus (ca. 2000 v.Chr. bis heute!) • die universale Rechenmaschine schlechthin! • verwendet in Griechenland, Rom, Japan, China (bis Datenblatt der Analytical Engine heute), Rußland (bis heute) • heute in Japan: Wettbewerbe Abakus – TaschenSpeicher für rund 100 Variable zu je 30-40 Stellen. rechner Chinesischer Vorrichtung zur Wiederholung von Operationen („mechanical means have been provided for backing up or advancing the operation cards to any extend“) Abakus: Stanzer für Zahlenkarten (Massenspeicher). 19 Drucker. Zeichengerät. 17 2.5.4 Die Analytical Engine Revolutionäre Ideen: • Programmierbarkeit einer Maschine durch Verwendung von Jacquard’schen Lochkarten. • Weiterverwendung von Zwischenergebnissen. (“the engine eating its own tail”) • Aufteilung des Gerätes in Speicher(Store) und Rechenwerk (Mill). Zahnstangen dienten der Übertragung von Zahlenwerten zwischen Store und Mill (Rechnerbus). Die Analytical Engine war ein Papiercomputer. Nur einzelne Komponenten (Teile des Rechenwerks) wurden wirklich gebaut. Bis 1948 (Speicherprogrammierbarkeit, John von Neumann) gibt es keine grundlegende Weiterentwicklung dieses Konzepts! Die ersten modernen Rechner hatten eine einfachere Architektur. 2.5.5 Zuse Z1, Z2 • Baujahr 1938, 1939 • Bleche schieben Stifte, Relais (Z2) • binär-dezimal Konvertierung, Operationen: √ +, −, ×, /, , 20 2.5.6 Zuse Z3 • Baujahr 1941 • programmierbar über Lochstreifen • Ausgabe über Lampenfeld • Binäre Schaltlogik • “RISC”-Architektur: wenige Befehle • Gleitpunktarithmetik • Multiplikationszeit: 3 sec. • Hauptspeicher: 64 Worte à 22 Bit 2.5.7 ASCC (MARK 1) • H. Aiken will Rechner zum Lösen von DGLs • erster Rechner mit konsequenter vonNeumannArchitektur • Baujahr 1944, Univ. Harvard und IBM • programmierbar über Lochstreifen • Multiplikationszeit: 6 sec. • in Betrieb bis 1959 • 760 000 Einzelteile • 15 m lang, 2.5 m hoch 2.5.8 Colossus • entwickelt u.a. von Alan Turing zum Knacken deutscher Enigma-Codes • Baujahr 1943, • programmierbar über Lochstreifen • photoelektr. Leser (5000 Zeichen/sec.) • Multiplikationszeit: 6 sec. • 1500 Röhren 21 Nachbau von Colossus 2.5.9 Die Chiffriermaschine Enigma • 1923: Erfindung durch Arthur Scherbius zum Gebrauch für Geschäftsleute. • 1925: Deutsche Wehrmacht kauft Enigmas. • mehrfach geknackt (Polen) und wieder verbessert. • 1939: Der Großangriff der Briten auf die Enigma in Bletchley Park. • 1942: Neue Enigma mit vier Walzen ist wieder sicher und wird im U-Boot-Krieg eingesetzt. • 1943: Nach fast einem Jahr wird die 4-WalzenEnigma geknackt. Hier kam Colossus zum Einsatz. • 1945: Entschlüsseln der Enigma-Codes war am Sieg der Alliierten mit beteiligt. ca. 10 000 Personen arbeiteten in drei Schichten rund um die Uhr. 2.5.10 Eniac (electronical numerical integrator and computer) • Baujahr 1946, Univ. Pennsylvania, USA • universell eingesetzt, in Betrieb bis 1955 • Dezimalrechner, 10 Dezimalstellen • Taktfrequenz 100 kHz (Addition 0,2 ms) • 18000 Röhren, 1500 Relais • Multiplikationszeit: 3 sec. • ?????? Programmierung ?????? 22 2.5.11 IBM 360 • Baujahr 1964 • Erster kommerziell erfolgreicher Großrechner • MTS: Michigan Time sharing system, 1966 2.5.12 Control Data CDC 6600 • Erbaut 1964 von S. Cray • 3 MIPS • verteilte Architektur, 10 I/O-Prozessoren 2.5.13 Telefunken TR 440 • Baujahr 1970 • Breite 6,50 m, Tiefe 0,55 m, Höhe 1,81 m • Gewicht ca. 1250 Kg • Taktfrequenz 20 MHz • Prozessorleistung 1,2 MIPS • 1,5 MB Kernspeicher mit virtueller Adressierung Lochkartenstanzer 23 2.5.14 Cray 1 • Baujahr 1976 • Vektorrechner • Supercomputer für numerische Berechnungen • 64 parallel arbeitende 64-Bit Prozessoren • 166 Mega-FLOPS • Gewicht: 2.5 Tonnen 2.5.15 Connection Machine • Baujahr 1986, D. Hillis of Thinking Machines Corp • Massiv parallel: 16000 parallele Prozessoren • Milliarden Operationen pro sec. • Anwendung in der KI, u.a. Neuronale Netze 2.5.16 PCs Commodore Pet, 1977, Kassettenlaufwerk, 4/8 kB Hauptspeicher 2 Apple 2, 1977, 1 Mainboard, Farbgrafik 24 IBM PC, 1981, 4.77 MHz Intel 8088, MS-DOS (Microsoft disc operating system) Commodore 64, 1981, für 595 US$ viel billiger als die Konkurrenz, TV-Bildschirm, Kassettenlaufwerk, 64 KB RAM 2.5.17 Zitate “I think there is a world market for about five computers.” Thomas J. Watson Jr., chairman of IBM (1943) “Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and perhaps weigh 1 12 tons.” Popular Mechanics (March 1949) “640 K [of computer memory] ought to be enough for anybody.” 2.6 Geschichte der Programmiersprachen • Heute gibt es über 2500 verschiedene Programmiersprachen • Siehe Aushang, bzw. www.levenez.com prozedural: Assembler, Fortran (1954), PL/1, Basic, Simula, APL, C, Pascal, Cobol, Perl, sh, awk, SQL, PHP funktional: Lisp (1958), Haskell, Miranda, Mathematica logisch: Prolog (1970) objektorientiert: Smalltalk (1969), C++, Oberon, Java, C# 2.6.1 Fakultät in C, Prolog, Mathematica C (prozedural): 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int fakultaet(int n) { int ergebnis; if (n == 1) return 1; ergebnis = n * fakultaet(n-1); return(ergebnis); } int main (int argc,char *argv[]) { int n; if(argc != 2) { printf("usage: fakultaet <n>\n"); return 1; } n = atoi(argv[1]); printf("Fakultät(%d) = %d\n", n, fakultaet(n)); } Mathematica (funktional): 1 2 Fac[0] := 1; Fac[n_] := n * Fac[n - 1] Prolog (logisch): 1 2 2.7 fakultaet(1,1). fakultaet(N,Res) :- N1 is N-1, fakultaet(N1,Res1), Res is N * Res1, Geschichte des Internet • Gegründet 1962 durch die Advanced Research Projects Agency (ARPA) der USA. • Bob Kahn und Vint Cerf erfinden 1973 das Transmission Control Protocol (TCP) und 1976 das TCP/IP Protokoll. • Bob Kahn und Vint Cerf erfinden 1973 das Transmission Control Protocol (TCP). • Erstes Email-Netz 1977 an der Univ. Wisconsin. • TCP/IP wird weltweit eingeführt • Tim Berners-Lee erfindet 1989 das World Wide Web (WWW) 26 “In the Beginning, ARPA created the ARPANET. And the ARPANET was without form and void. And darkness was upon the deep. And the spirit of ARPA moved upon the face of the network and ARPA said, ’Let there be a protocol,’ and there was a protocol. And ARPA saw that it was good. And ARPA said, ’Let there be more protocols,’ and it was so. And ARPA saw that it was good. And ARPA said, ’Let there be more networks,’ and it was so.” – Danny Cohen 2.7.1 Das Semantic Web • Neben Text und Bildern soll der Inhalt (Semantik) von Webseiten in Zukunft durch Annotationen formal beschrieben werden. • Anfrage: Wie viele Tore hat Michael Ballack im Jahre 1998 geschossen? • Google kann die Anfrage nicht beantworten. • Das Semantic Web soll das demnächst können. • Resource Description Framework (RDF) und Web Ontology Language (OWL) zur Beschreibung von Metainformation über Webseiten • Unter Verwendung von Automatischen Theorembeweisern sollen semantische Anfragen beantwortet werden. 2.7.2 Aktuelle Trends (2005) 27 2.8 Große Informatiker 2.8.1 • Blaise Pascal (Frankreich, 1623–1662) baute als 18 jähriger für seinen Vater die erste funktionierende mechanische Rechenmaschine zur Addition sechsstelliger Zahlen. (Digitalrechner) 2.8.2 Gottfried Wilhelm Leibniz (Leipzig, 1646–1716) • Philosoph, Mathematiker • baut eine Rechenmaschine für alle vier Grundrechenarten. 2.8.3 Charles Babbage (England, 1791-1871) • Entwickelt die Difference Engine zur Ableitung von Polynomen (1823) • Entwickelt die Analytical Engine (1833) 2.8.4 Kurt Gödel (Österreich, 1906–1978) Der Österreicher Kurt Gödel zeigt 1931 • dass in der Prädikatenlogik erster Stufe alle wahren Aussagen herleitbar sind. • In Logiken höherer Stufe hingegen gibt es wahre Aussagen, die nicht beweisbar sind. Es lassen sich also nicht alle Berechnungsaufgaben automatisieren. Zusammen mit Einstein arbeitet er auch an der Relativitätstheorie und Kosmologie. 28 Denken Sie nach über die Aussage: Ich bin nicht beweisbar oder über Die Menge aller Barbiere die sich nicht selbst rasieren. oder über die Menge {x|x ∈ / x}. 2.8.5 Alan Turing (England, 1912–1954) Der Brite Alan Turing leistet u.a. folgendes • Er erfindet 1935 das bis heute universelle Berechnungsmodell, die “Turingmaschine”. • Er zeigt, dass es viele Funktionen gibt, die nicht berechenbar sind. • Er beweist das Halteproblem: Es kann kein Programm geben, das in endlicher Zeit entscheidet, ob ein beliebiges Programm auf einer Eingabe hält oder eine Endlosschleife hat. • Er definiert den Begriff der Intelligenz über den “Turing Test”. • Ende der Dreißiger Jahre macht er schon Vorschläge für lernfähige Computer. • Er ist im 2. Weltkrieg führend beteiligt an der Dechiffrierung der Enigma. • Er ist beteiligt am Bau von Colossus, dem ersten britischen Computer für die Dechiffrierung der Enigma (1944). Denken Sie nach über das Programm: unmöglich(int i) { if( hält(unmöglich,0)) while( TRUE ) printf(‘‘das kann noch dauern ...’’); else printf(‘‘0’’); } Die Turingmaschine: Lesekopf HAL LO Z 29 Zustand 2.8.6 Claude Shannon (Michigan, 1916–2001) • A Mathematical Theory of Communication (1948) • Informationstheorie, Entropie als Informationsmaß • Formale Grundlagen der Kryptographie (Konfusion und Diffusion, 1949) • Entwickelt einen Schachcomputer (1960) 2.8.7 Alonzo Church (Washington, 1903–1995) • Berechenbarkeit • Lambda Kalkül • Church’sche These: Die Turingmaschine kann alles berechnen, was wir intuitiv für berechenbar halten. 2.8.8 John von Neumann (Polen, 1903–1957) • Spieltheorie, Minimax Algorithmus (1928) • Quantenmechanik, Entwicklung der Atombombe • von Neuman Architektur von Rechnern (EDVAC) • genial, lebenslustig, trinkfest 2.8.9 Die vonNeumann-Architektur CPU Speicher (RAM) Rechenwerk Steuerwerk Datenbus Adressbus • Zentraleinheit (CPU) ◦ ◦ Rechenwerk Steuerwerk 30 I/O • Speicher (Hauptspeicher) • Bus (Busse) • Ein/Ausgabesysteme (I/O) ⇒ Peripheriegeräte 2.8.10 Edsger Dijkstra (Rotterdem, Holland, 1930–) • Algorithmen auf Graphen • Kürzeste Wege Algorithmen • Korrektheit von Programmen 2.8.11 Donald Knuth (Milwaukee, 1938–) • Meister der Algorithmen, u.a.: Zufallszahlen, Sortieren, Suche, ... • Autor der 5-bändigen Bibel: “The Art of Computer Programming” • Erfinder des Textsatzsystems TEX spielt eine selbstgebaute Orgel • Zitate: “Computer Programming is an art form, like the creation of poetry or music.” “I got into compilers because I thought the most amazing thing you could do with computers was to have them write their own programs. When computing is applied to computing, that’s when computer science reaches an ultimate completeness.” 2.8.12 Stephen A. Cook (Buffalo, New York, 1939–) • Begründer der modernen Komplexitätstheorie • NP-Vollständigkeit 31 2.8.13 Leslie Lamport (New York, 1941–) • Theorie verteilter Systeme • Lamport clock: partielle Ordnung der Zeit, keine globale Zeit • Enwickler von LATEX(TEX-Macropaket) Zitat: “When I look back on my work, most of it seems like dumb luck – I happened to be looking at the right problem, at the right time, having the right background.” 2.8.14 Ken Thompson, Dennis Ritchie (New Orleans, 1943–, New York, 1941–) • 1969: Erfindung von UNIX (Bell Laboratories, New Jersey, später AT&T) • Erfinder von C • Viele innovative Konzepte: ◦ ◦ ◦ ◦ Pipelining verteilte Prozesse Sockets Timesharing und Prozesse mit Prioritäten (auch auf PCs) 32 2.8.15 Nikolaus Wirth (Winterthur, Schweiz, 1934–) • Erfinder der Programmiersprachen Pascal (1970) und Modula (1975) • Erfinder der Objektorientierten Sprache Oberon (1987) 2.8.16 Bill Gates (Seattle, 1955–) • zus. mit Paul Allen Gründer von Microsoft • mit dem Kauf von MS-DOS 1980 beginnt die Erfolgsstory von Microsoft • reichster Mann der Welt (fast 50 Mrd. US$) 2.8.17 Tim Berners-Lee (London, 1955–) • 1989 schlug Berners-Lee seinem Arbeitgeber CERN (Europäisches Kernforschungslabor) ein Projekt vor, das auf dem Prinzip des Hypertexts beruhte und den weltweiten Austausch sowie die Aktualisierung von Informationen zwischen Wissenschaftlern vereinfachen sollte.[1] • entwickelte den ersten Webbrowser • baute die erste Webseite 2.8.18 Der Turing Award siehe www.acm.org/awards/taward.html ACM’s most prestigious technical award is accompanied by a prize of $ 100,000. Financial support of the Turing Award is provided by the Intel Corporation. ACM: Association of Computing Machinery 1966 1967 1968 1969 1970 1971 1972 1973 A.J. Perlis Maurice V. Wilkes Richard Hamming Marvin Minsky J.H. Wilkinson John McCarthy E.W. Dijkstra Charles W. Bachman Compilerbau EDSAC, erster Computer mit internem Programmspeicher Kodierung, Hamming-Distanz Perzeptron, Neuronale Netze Numerik Künstliche Intelligenz, LISP Graphenalgorithmen, ALGOL Datenbanken 33 1974 Donald E. Knuth 1975 Allen Newell Herbert A. Simon 1976 Michael O. Rabin Dana S. Scott 1977 John Backus 1978 Robert W. Floyd 1979 Kenneth E. Iverson 1980 C. Antony R. Hoare 1981 Edgar F. Codd 1982 Stephen A. Cook 1983 Ken Thompson Dennis M. Ritchie 1984 Niklaus Wirth 1985 Richard M. Karp 1986 John Hopcroft Robert Tarjan 1987 John Cocke 1988 Ivan Sutherland 1989 William (Velvel) Kahan 1990 Fernando J. Corbato 1991 Robin Milner 1992 Butler W. Lampson 1993 Juris Hartmanis, Richard E. Stearns 1994 Edward Feigenbaum Raj Reddy 1995 Manuel Blum 1996 Amir Pnueli 1997 Douglas Engelbart 1998 James Gray 1999 Frederick P. Brooks 2000 Andrew Chi-Chih Yao 2001 Ole-Johan Dahl, Kristen Nygaard 2002 Ronald L. Rivest, Adi Shamir, Leonard M. Adleman 2003 Alan Kay 2004 Vinton G. Cerf, Robert E. Kahn 2.9 Algorithmen, “The Art of Computer Programming” Erfinder des Textsatzsystems TEX Künstliche Intelligenz General Problem Solver Automaten, Algorithmen, Nichtdeterminismus randomisierte Algorithmen FORTRAN, Backus-Naur-Form Grammatik formale Methoden zur Software Entwicklung Programmiersprachen, APL Programmiersprachen Relationale Datenbanken Komplexität, NP-Vollständigkeit Betriebssystem UNIX MODULA, PASCAL, Oberon NP-Vollständigkeit Algorithmen und Datenstrukturen (Lehrbuch) Compilerbau, RISC-Computer Computergraphik Numerik, Floating Point Arithmetik Time sharing Logik, funktionale Progarmmierung: ML PC-Entwicklung (Microsoft) Komplexitätstheorie Künstliche Intelligenz, prakt. Umsetzung Komplexitätstheorie, Kryptographie Temporallogik, Programmverifikation Maus, Fenster Datenbanktechniken Rechnerarchitaktur, IBM 360 Zufallszahlen, Kryptographie Simula, OOP Public Key Kryptographie, RSA-Algorithmus Objektorientierte Programmierung, Smalltalk Vernetzung, TCP/IP Frauen in der Informatik Warum gibt es so wenige Frauen in der Informatik?1 1 teilweise entnommen aus Olga Goldmann Seminar: Geschichte der Informatik, www.virtosphere.de/ schillo/teaching/WS2001/Geschichts-Seminar.html 34 • Intelligenztests zeigen minimale Unterschiede ausschließlich bei: ◦ ◦ • Vorstellung räumlicher Drehungen von Figuren zugunsten der Männer Sprachkompetenzen zugunsten der Frauen Es gibt keine Intelligenz und Begabungsunterschiede die die geringe Beteiligung der Frauen erklären können! 2.9.1 Frauenanteil am Informatik-Studium. Land England Italien, Frankreich, Spanien, Portugal frühere Sowjetunion Bulgarien Griechenland Indien, Malaysia, Singapur Deutschland 2.9.2 Frauenanteil [%] 35 40–50 50 60–70 59 50 8 Frauen in der Geschichte der Informatik Ada Augusta von Lovelace (1815-1852) • arbeitet mit Ch. Babbage an der Analytical Engine • Mutter von vier Kindern • Sie erfand Unterprogramme, Schleifen und bedingte Sprünge! • publizierte unter dem Kürzel A.A.L. Die Analytical Engine Die wesentliche Neuerung der Analytical Engine ist ihre Programmierbarkeit. store: Arbeitsspeicher, in dem Speicherplatz für bis zu 1000 Werte mit maximal 50 Dezimalstellen sein sollte, mill: Central Processing Unit (CPU), die im wesentlichen aus der Difference Engine bestehen sollte. Eingabeschnittstelle für Lochkarten, unterschieden nach operation cards für die Befehlseingabe, variable cards zur Eingabe von Variablen und ihrer Speicheradresse, sowie den number cards. eigene Bibliothek die die Analytical Engine sich aus den errechneten Tabellenwerten aufbaut Ausgabeschnittstelle entweder für einen Drucker oder für Lochkarten die in die Bibliothek eingereiht werden. 35 Grace Murray Hopper (1906-1992) • beteiligt an Entwicklung von Mark 1, Mark 2, Univac 1 • entwickelt 1952 einen der ersten Compiler • “Debugging”: Eine tote Motte (bug) blockiert ein Relais im Rechner. Zitat: First actual case of a bug being found. • Zitat: Wenn du eine gute Idee hast, dann tu es einfach, denn es ist viel einfacher sich hinterher zu entschuldigen, als vorher um Genehmigung zu bitten. • Über 40 Ehrendoktorwürden, National Medal of Technology der USA als erste Frau. Bis etwa 1960 waren viele Frauen in der Informatik tätig: • Beim Knacken der Enigma in Bletchley Park (England) • Bei der Bedienung und Programmierung früher Rechner ◦ ◦ ◦ 2.10 Colossus (G.B.) Eniac (USA) nach dem Krieg in Deutschland Wichtige Institute und Firmen IAS: Institute for advanced studies, Princeton, New Jersey, USA MIT: Massachusettes Institute for Technology, Cambridge, Massachusetts, USA SRI: Stanford Research Institute, Palo Alto, USA Stanford University, Palo Alto, California, USA Harvard University, Cambridge, Massachusetts, USA UCB: Univ. of California, Berkeley, USA AT&T Bell Labs: New Jersey, USA 36 Kapitel 3 Endliche Automaten Alle gängigen Programmiersprachen sind Turingmächtig. Das heißt, Programme in diesen Sprachen können alles berechnen, was wir intuitiv als berechenbar ansehen. Diese Sprachen sind also sehr “mächtig”. Für einfache Aufgabenstellungen in der Softwareentwicklung möchte man ein einfacheres Programmiermodell um die Programmierung zu vereinfachen. 3.1 Endliche Automaten zur Worterkennung Ein derartiges einfaches Modell ist der endliche Automat. Anschaulich ist ein endlicher Automat ein Rechenelement, welches auf einem Eingabeband beginnend mit dem ersten Zeichen der Eingabe das eingegebene Wort Zeichen für Zeichen liest. In jedem diskreten Rechenschritt macht der Automat einen Zustandsübergang. Abhängig vom aktuellen Zustand und dem gelesenen Zeichen geht der Automat in einen neuen Zustand über. Die Zahl der Zustände ist endlich. Erreicht der Automat nach Lesen des letzten Zeichens einen Endzustand, so hat er das Wort erkannt. Lesekopf HAL LO Z Zustand Beispiel 3.1 Der durch folgende Regeln beschriebene Automat akzeptiert alle Zeichenketten (Worte) bestehend aus einer beliebigen Anzahl a-s gefolgt von einer beliebigen Anzahl b-s, mindestens jedoch ein a und ein b. Die Regelmenge des Automaten mit den Zuständen A, B und dem Endzustand e ist δ = {S, a → S; S, a → T ; T, b → T ; T, b → e} Die Zustandsübergangsrelation δ läßt sich übersichtlich durch die Zustandsübergangstabelle darstellen T e δ S a {S, T } b {T, e} Man beachte, dass die Zustandsübergangsrelation δ nicht eindeutig ist, denn zum Beispiel kann der Automat nach Lesen eines a im Zustand S nach S oder nach T übergehen. Dies zeichnet den nichtdeterministischen Automaten aus. Besonders anschaulich ist der zugehörige Zustandsgraph: a S b a T 37 b e Der beschriebene Automat kann nur passiv Eingaben akzeptieren oder abweisen. Er löst also ein binäres Entscheidungsproblem. Man kann solch einen Automaten einfach erweitern durch eine Ausgabefunktion. 3.2 Automaten mit Ausgabe Beispiel 3.2 Es soll ein Getränkeautomat mit Hilfe eines endlichen Automaten programmiert werden. Der Automat kann mit bis zu 4 Dosen Mineralwasser gefüllt werden. Wenn eine 1Euro-Münze eingegeben wird, soll er eine Dose Wasser ausgeben. Bei Eingabe einer anderen Münze soll er die eingegebene Münze wieder ausgeben, aber kein Getränk. Wenn der Automat leer ist soll er anhalten und per Funk den Service benachrichtigen. Ein endlicher Automaten (mit Ausgabe) für diese Aufgabe ist gegeben durch folgende Tabelle mit den Zuständen z0 , z1 , z2 , z3 , z4 , den erlaubten Eingabezeichen e, f, m. Im Zustand zi enthält der Automat i Flaschen Mineralwasser. e steht für die Eingabe eines Euro, f für Eingabe einer falschen Münze. m steht für eine Flasche Mineralwasser. m kann sowohl eingegeben werden (durch den Betreiber) als auch ausgegeben werden (an den Kunden). Jedes Paar x, y in der Tabelle besteht aus dem Eingabezeichen x und dem Ausgabezeichen y. z0 m z1 , ε e z0 , e f z0 , f z1 z2 , ε z0 , m z1 , f z2 z3 , ε z1 , m z2 , f z3 z4 z4 , ε z2 , m z3 , m z3 , f z4 , f Das Zustandsdiagramm zu diesem Automaten sieht so aus: f z0 f m e z1 f m e z2 f m e z3 f m e z4 e Dieser Automat akzeptiert alle Eingabesequenzen (Worte), die zum leeren Automaten (d.h. zu z0 ) führen. 3.3 Formale Beschreibung von Automaten Genau wie bei allen Programmiersprachen wird auch für endliche Automaten eine streng formale Beschreibung benötigt. Diese ist aber auch noch für theoretische Überlegungen in der Theorie der formalen Sprachen notwendig ( ⇒ Theoretische Informatik, Master). Wir beginnen ganz elementar: k Definition 3.1 Ein Alphabet Σ ist eine endliche nicht leere Menge von Zeichen. Sprachen sind noch einfacher als Lego-Baukästen. Es gibt genau vier Möglichkeiten, zwei Alphabetzeichen a und b miteinander zu verknüpfen, nämlich aa, ab, ba, oder bb. Diese Verknüpfung heißt Konkatenation und ist nicht vertauschbar. Damit kann man beliebig lange endliche Worte 38 bauen, ähnlich wie bei den Legos. Definition 3.2 Die Menge Σ∗ aller Worte ist wie folgt rekursiv definiert. • Σ ⊂ Σ∗ und auch das leere Wort ε ist in Σ∗ enthalten. • Für jedes Wort w ∈ Σ∗ und jedes Zeichen x ∈ Σ ist auch wx ∈ Σ∗ . wx ist die Zeichenkette, die entsteht, wenn man das Zeichen x an das Wort w anhängt. Jede Teilmenge von Σ∗ wird Sprache genannt. Beispiel 3.3 Σ = {0, 1} Σ∗ = {0, 1, ε, 00, 01, 10, 11, 001, 000, 011, 010, . . .} Beispiel 3.4 Σ Σ∗ T erme T erme = = = ⊂ {+, −, ·, /, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, x, y, a, b} {. . . , ) + − · 567ax, . . .} {x, y, a, b, (a), . . .} Σ∗ Die Menge aller korrekten arithmetischen Terme ist eine kleine Teilmenge von Σ∗ . Ein Affe, der zufällig auf einer entsprechenden Tastatur tippt würde viele Versuche benötigen, um einen korrekten Term zu erzeugen. Nun kennen wir einige reguläre Sprachen. Wir stellen uns die Frage ob es eine möglichst einfache und effiziente Rechenmaschine gibt, mit der man für ein beliebiges Wort w entscheiden kann, ob dieses zu einer vorgegebenen regulären Sprache gehört. Definition 3.3 Die Aufgabe, zu entscheiden, ob ein Wort w zu einer Sprache L gehört, heißt Wortproblem. Grammatik erzeugt erkennt −→ Sprache ←− Automat Das Wortproblem für reguläre Sprachen kann durch endliche Automaten effizient gelöst werden. 39 Formal wird der Automat wie folgt definiert: Definition 3.4 Ein endlicher Automat M besteht aus einem 5-, bzw. 7-Tupel M = (Z, Σ, δ, z0 , E) bzw. M = (Z, Σ, δ, z0 , E, γ, Θ) mit Z : endliche Zustandsmenge Σ : endliches Eingabealphabet, Σ ∩ Z = φ δ : Z × Σ → P(Z), die Zustandsübergangsfunktion z0 : Startzustand E : Menge der Endzustände γ : Z × Σ → Θ, die Ausgabefunktion Θ : Ausgabealphabet Definition 3.5 Ein Wort w = w1 . . . wn mit wi ∈ Σ wird akzeptiert von dem endlichen Automaten M genau dann wenn M gestartet im Startzustand auf w1 nach n Anwendungen der Funktion δ, d.h. nach Lesen von wn , einen Endzustand z ∈ Σ erreichen kann. Die von M akzeptierte (erkannte) Sprache L(M ) ist L(M ) = {w ∈ Σ∗ | M akzeptiert w} Beispiel 3.5 Der Automat aus Beispiel 3.1 wird beschrieben durch das 5-Tupel M = ({S, T, e}, {a, b}, δ, S, {e}) mit δ = {S, a → S; S, a → T ; T, b → T ; T, b → e}. Beispiel 3.6 Der Getränkeautomat aus Beispiel 3.2 wird beschrieben durch das 7-Tupel ({z0 , z1 , z2 , z3 , z4 }, {e, f, m}, δ, z0 , {z0 }, γ, {e, f, m}) wobei δ und γ gegeben sind durch die angegebene Automatentabelle. Definition 3.6 Beim nichtdeterministischen endlichen Automaten (NFA) sind (im Gegen satz zum deterministischen endlichen Automaten (DFA)) für jeden Zustand Z und Eingabe zeichen a mehrere Regeln z, a → z1 .. . z, a → zn erlaubt. Satz 3.1 NFAs und DFAs sind gleich mächtig, d.h. zu jedem NFA gibt es einen DFA, der die gleiche Sprache erkennt. 40 Kapitel 4 Sortieralgorithmen 4.1 Sortieren durch Einfügen Beispiel 4.1 7 4 8 3 5 1 4 7 8 3 5 1 4 7 8 3 5 1 3 4 7 8 5 1 3 4 5 7 8 1 1 3 4 5 7 8 Definition 4.1 Eine Liste A = (A1 , . . . , An ) heisst sortiert, wenn für alle i = 1, . . . , n − 1 gilt Ai ≤ Ai+1 . 4.1.1 Algorithmus (grob) Von links nach rechts: eine Zahl x wählen und verschieben nach links bis Ai−1 ≤ Ai = x ≤ Ai+1 erfüllt ist. For i:= 2 To n Do x:= a[i]; "füge x am richtigen Platz ein" 4.1.2 Algorithmus als PASCAL-Programm Program sortieren(input,output); CONST n = 8000; TYPE index = 0..n; item = RECORD key : Integer; data : String[20] END; itemarray = ARRAY [0..n] OF item; VAR a : itemarray; i,j : Index; 41 Procedure ins sort(var a : itemarray); VAR i,j : index; x : item; BEGIN FOR i := 2 TO n DO BEGIN x := a[i]; a[0] := x; j := i-1; WHILE x.key < a[j].key DO BEGIN a[j+1] := a[j]; j := j-1; END; a[j+1] := x END END; Index i: Liste A: 0 x 1 Rechenzeit worst case (Tmin (n)) (n − 1) · (I + C) best case (Tmax (n)) (n − 1) · (I + C) (n Pn− 1) · (3M + I) i=2 i · C (n − 1) · (3M + I) (n − 1) · C Pn i · (M + I) Pi=2 n i=2 i · (M + 2I) 0 0 (n − 1) · (I + M ) (n − 1) · (I + M ) i a(i) n Durch kopieren von a(i) auf die Variable x und auf a(0) wird die Terminierung der Schleife sichergestellt. Sollte die Zahl a(i) also kleiner als alle Elemente davor in der Liste sein und ganz nach links verschoben werden müssen würde der Schleifenindex i ohne diese Terminierung einen negativen Wert annehmen. Da die Liste aber bei a(0) aufhört, würde dies zu einem undefinierten Zustand führen. Diese Terminierung führt zu einem weiteren Schleifendurchlauf. Dieser Durchlauf fällt aber nicht weiter ins Gewicht, da es sich um einen konstanten Aufwand handelt. Dagegen wird im Vergleich zu einer zusätzlichen Bedingung im Kopf der While-Schleife ein Aufwand proportional zu n eingespart. 4.1.3 Worst - Case Rechenzeit Im Programmcode eingetragen ist für jede Programmzeile die Laufzeit. Als Parameter treten rechnerabhängigen Größen I (Increment), M (Move) und C (Compare) auf: I = Rechenzeit für eine Zähloperation M = Rechenzeit für eine Zuweisungsoperation C = Rechenzeit für eine Vergleichsoperation Diese Zeiten sind konstant, d.h. nicht von n abhängig und deshalb für die Berechnung der Komplexität unbedeutend. Für die Berechnung von exakten Laufzeiten sind sie jedoch sehr wichtig. Tmax (n) = (n − 1) · (I + C + 3M + I + M + I) + n X (i · C + i · (M + 2I)) i=2 = (3I + 4M + C) · n − (3I + 4M + C) + (2I + M + C) · n X i=2 mit n X i=2 i= n2 + n − 2 n2 n n(n + 1) −1= = + −1 2 2 2 2 42 i erhalten wir a b }| { z }| { c z }| { C 3 M 9 Tmax (n) = (I + + ) ·n2 + (4I + M + C) ·n −(5I + 5M + 2C) 2 2 2 2 2 = a·n +b·n+c z Wenn die Konstanten nicht interessieren, kann die Berechnung der Worst-Case Rechenzeit vereinfacht werden: (n − 1) · (I + C) (n − 1) · (3M + I) n X i·C → → → (n − 1) · c1 (n − 1) · c2 2 X ( i) · c3 i=2 i=2 .. . .. . .. . Ergebnis: a · n2 + b · n + c Bestimmung von a, b und c 1.) Messe drei Zeiten für verschiedene n = n1 , n2 , n3 −→ (n1 , T1 ), (n2 , T2 ), (n3 , T3 ) T(n) T3 T2 T1 n1 n2 n3 n 2.) Einsetzen in Parabelgleichung: T1 = a · n21 + b · n1 + c T2 = a · n22 + b · n2 + c T3 = a · n23 + b · n3 + c 3.) Auflösen des linearen Gleichungssystems nach a, b und c (siehe Übung 5). Beispiel 4.2 Vergleich von 3 verschiedenen Komplexitäten n 10 100 1000 Algorithmus 1 T (n) = log n · c 1s 2s 3s Algorithmus 2 Algorithmus 3 T (n) = c · n T (n) = c · n2 10 s 100 s 100 s 10 000 s 1000 s 1 000 000 s Algorithmus 4 T (n) = c · n3 1 000 s 1 000 000 s 1 000 000 000 s Algorithmus 5 T (n) = c · 2n 1024 s ≈ 1030 s ≈ 10300 s Die Werte wurden mit einem c von einer Sekunde errechnet. Eine bessere Hardware würde nur dieses c verbessern und dadurch die Rechenzeit nicht wesentlich beeinflussen. Bei großen n ist die Komplexität viel ausschlaggebender als die Konstante c. 43 4.1.4 Best-Case Rechenzeit Ist die Liste A vorsortiert, so wird die While-Schleife nicht durchlaufen und das Programm ist viel schneller. Analog zu den Berechnungen im Worst-Case kann man auch im Best-Case die Zeiten aus der Tabelle aufaddieren und man erhält Tmin (n) = d · n + e. 4.1.5 Einschub: Asymptotik Beschreibung des asymptotischen Verhaltens von Rechenzeiten T (n) (oder Speicherplatz oder anderer Funktionen) für n → ∞. Idee: Vernachlässigung von konstanten Faktoren. Nur die Abhängigkeit von n für große n ist wichtig. Definition 4.2 Seien die Funktionen f : N → R+ , g : N → R+ gegeben. Dann schreibt man: Asymptotische obere Schranke: f (n) f (n) = O(g(n)) ⇔ ∃ c ∈ R+ : lim ≤c n→∞ g(n) f (n) f (n) = o(g(n)) ⇔ lim =0 n→∞ g(n) Asymptotische untere Schranke: f (n) ≥c f (n) = Ω(g(n)) ⇔ ∃ c ∈ R+ : lim n→∞ g(n) f (n) f (n) = ω(g(n)) ⇔ lim =∞ n→∞ g(n) Asymptotische enge (harte) Schranke: f (n) + ≤ c2 f (n) = Θ(g(n)) ⇔ ∃ c , c ∈ R : c ≤ lim 1 2 1 n→∞ g(n) O, Ω, Θ, o, ω sind Relationen auf Funktionen, wie z.B. <, ≤ auf reellen Zahlen. Analogien: Funktionen f : N → R+ f (n) = O(g(n)) f (n) = o(g(n)) f (n) = Ω(g(n)) f (n) = ω(g(n)) f (n) = Θ(g(n)) reelle Zahlen a≤b a<b a≥b a>b a=b Satz 4.1 T (n) = Θ(g(n)) ⇔ T (n) = Ω(g(n)) und T (n) = O(g(n)) 44 Die bisher berechneten Ergebnisse lassen sich nun also formulieren wie folgt: Satz 4.2 Beim Sortieren durch Einfügen gilt Tmin (n) Tmax (n) T (n) T (n) 4.1.6 = = = = Θ(n) Θ(n2 ) Ω(n) O(n2 ) Schwachstellen und mögliche Verbesserungen x Die Suche nach der Einfügestelle für das Element x soll verbessert werden. Suche in Listen Aufgabe 1: Suche ein Element x in einer beliebigen Liste. optimale Lösung: lineare Suche mit Tmax (n) = Θ(n) Aufgabe 2: Suche ein Element x in einer sortierten Liste A[1 . . . n] optimale Lösung: Bisektion Der Bereich links von x ist bereits sortiert. Man findet die richtige Stelle für x indem man die Liste links von x mehrfach halbiert. Definition 4.3 bxc := max{y ∈ Z|y ≤ x}. bxc ist also die größte ganze Zahl kleiner oder gleich x. Analog sei dxe = min{y ∈ Z|y ≥ x}. Der Bisektionsalgorithmus a = 1 b = n m = b a+b c 2 while A[m] 6= x & b > a If x < A[m] Then b = m Else a = m m = b a+b c 2 If A[m] == x Then print (’’Hurra ’’,x,’’gefunden an position ’’,m) Else print (’’Schade, ’’,x,’’nicht in A’’) 45 Komplexität Sei die Arraylänge n = 2k . Dann sind höchstens k Wiederholungen der While-Schleife erforderlich. Also ist die Rechenzeit proportional zu k, d.h. T (n) = c · k. n = 2k lnn = k · ln 2 ln n k = ln 2 Also gilt für die Bisektion T (n) = c · ln n = c · log2 n = O(log n) ln 2 x Erläuterung: An log2 x = ln = c · ln x ← log n, erkennt man, daß sich alle Logarithmen nur ln 2 um einen kostanten Faktor unterscheiden. Das Suchen der Einfügestelle ist mit logarithmischem Aufwand möglich. Aber: verschieben der O(n) Arrayelemente im Array kostet linearen Aufwand. Idee: verwende dynamische Datenstruktur als verkettete Liste. x Verschieben der Arrayelemente ist damit unnötig. x wird direkt an der richtigen Stelle eingefügt. Aber: die Bisektion ist auf einer verketteten Liste nicht anwendbar. Daher: für Sortieren durch Einfügen bleibt Tmax (n) = Θ(n2 ) 4.2 Quicksort Beispiel 4.3 Es soll die Liste 5, 3, 2, 6, 4, 1, 3, 7 sortiert werden. Dies erfolgt nach dem Prinzip divide and conquer durch rekursiv wiederholtes Aufteilen und bearbeiten, wie in folgender Tabelle zu sehen: 46 5 3 2 6 4 1 3 7 ↑i x = 5 (Pivotelement) ↑j 5 ↑i 3 3 2 3 2 3 3 2 3 ↑i 1 3 2 ←→ 3 2 ↑i ↔↑j 2 3 3 ↑j ↑i 2 3 3 ↑i ↔↑j 2 3 3 ↑j ↑i 2 3 3 ↑i ↑j 2 3 3 1 1 ↑i ↑j 1 1 1 6 4 ←→ 6 4 ↑i ↔ 1 4 ↑j 1 4 ↑j 3 4 1 3 ↑j 5 7 7 4 1 ↑j 6 5 ↑i 6 5 ↑i ↔↑j 5 6 ↑j ↑i 5 6 ↑i ↑j 5 6 4 5 6 7 4 5 6 7 4 5 6 7 4 7 7 x = 3, x = 6 7 7 7 Erläuterung: Der erste Wert der Liste ist das Pivotelement (ausgezeichnetes, besonderes Element). Zwei Indizes i und j durchlaufen die Liste nach folgendem Kriterium: i sucht von links nach einem Wert ≥ x und j von rechts nach einem Wert ≤ x. Dann werden i und j vertauscht. Das setzt sich solange fort bis sich beide Indizes überkreuzen oder gleich sind. Dann wird die Liste rechts von j geteilt und auf beiden Hälften rekursiv von vorne begonnen. 4.2.1 Der Algorithmus Seien A=Liste, p=Anfangsindex, r=Endeindex. Dann ist die rekursive Struktur gegeben durch: Quicksort(A,p,r) if p<r then q=Partition (A,p,r) Quicksort (A,p,q) Quicksort (A,q+1,r) Das Aufteilen erfolgt mittels 47 Partition (A,p,r) x=A[p] i=p-1 j=r+1 while TRUE do repeat j=j-1 until A[j] ≤ x repeat i=i+1 until A[i]≥ x if i<j then vertausche A[i] mit A[j] else Return(j) Der erste Aufruf von Quicksort auf einer Liste der Länge n erfolgt durch Quicksort(A,1,length(A)). 4.2.2 Analyse Laufzeit von Partition auf Array A[p...r] mit n = r − p + 1 T (n) = Θ(n) Laufzeit von Quicksort (Best Case) n n/2 n/2 n/4 111... n/4 n/4 n/4 ...111 Komplexität auf jeder Ebene ist Θ(n) =⇒ Komplexität gesamt: Θ(n · log2 n) Zahl der Ebenen im Rekursionsbaum? Der Baum wächst in der Breite exponentiell: n = 2k → k = Tiefe des Baumes log2 n = log2 2k = k Tmin (n) = c · n · log2 n = Θ(n log n) 48 Laufzeit von Quicksort (Worst Case, sortierte Liste) 1 2 3 4 5 6 7 8 ↑i ↑j 1 ↑i ↑j 1 1 2 3 4 5 6 2 ↑i ↑j 2 3 4 5 3 ↑i ↑j 4 5 6 7 8 6 7 8 7 8 Rekursionsbaum n n n n-1 1 1 n-2 n-1 n 2 1 1 2 1 n X Tmax (n) = c2 · ( i + n) i=2 n(n + 1) − 1 + n) 2 n2 3 = c2 · ( + n − 1) 2 2 2 = Θ(n ) = c2 · ( Für die Rechenzeit T(n) gilt: c1 · n log n ≤ T (n) ≤ c2 · n2 Idee zur Verhinderung des Worst Case: Liste vorher zufällig permutieren. Begründung: Die Wahrscheinlichkeit für das Erzeugen einer sortierten Liste ist sehr klein. falls nur 10 Zahlen erlaubt sind. Allgemeine Wahrscheinlichkeit: M1n für M unterschiedliche zu sortierende Werte. Beispiel 4.4 32 Bit Integer Zahlen: M = 232 , n = 106 , 1 Mn = 1 (232 )106 = 1 10n 1 232·106 Folgerung: Die Wahrscheinlichkeit, dass ein randomisiertes Quicksort den Worst-Case trifft ist sehr klein. Aber die zufällige Permutation der Liste vor dem Sortieren kostet Rechenzeit. Daher: 49 Zufällige Wahl des Pivotelements ersetze x = A[p] durch x = A[random (p,r)] Average-Case-Analyse: Berechnung der mittleren Laufzeit des Algorithmus z.B. Quicksort auf einer repräsentativen Menge von Eingaben. Beispiel 4.5 Die Average-Case-Analyse für Quicksort ist sehr schwierig. Daher wird hier der ungünstige Fall eines konstanten Aufteilungsverhältnisses 1 : n am Beispiel 1 : 9 behandelt. n 9n/10 1n/10 81n/100 9n/100 9n/100 1n/100 729n 81n 1000 1000 81n 9n 1000 1000 81n 9n 1000 1000 9n 1n 1000 1000 9 dl ( 10 ) ·n=1 1 dr ( 10 ) ·n=1 9 + log n = 0 10 log n dl = log 10 9 dl · log T (n) < Tiefe k = log n log 10 9 c · n log n log 10 9 ≈ 21, 8 · log10 n Aufwand auf jeder Ebene ≤ n ⇒ im Best-Case auch n · log n ist, gilt: T (n) = O(n · log n). Da die komplexität von Quicksort Satz 4.3 Quicksort besitzt im Average-Case die Komplexität T (n) = Θ(n · log n) Bemerkung: Der Worst-Case tritt bei Quicksort sehr selten auf. Er kommt bei vorsortierten Listen vor, diese sind in der Praxis allerdings häufig. Verbesserung: zufällige Wahl des Pivot-Elements, d.h. Ersetzung von Partition (A,p,r) durch: Random-Partition (A,p,r) i=Random (p,r) vertausche A[p] mit A[i] return Partition (A,p,r) Random (p,r) liefert zufällig mit konstanter Wahrscheinlichkeit eine Zahl aus {p, p+1, . . . ,r}. Bemerkung: Durch Randomisierung gibt es keine Eingabe mehr, für die der Algorithmus immer Worst-Case Verhalten zeigt. 50 4.3 Sortieren mit Bäumen (Heapsort) Beispiel 4.6 1 16 i: A[i] : 2 14 3 10 4 8 5 7 6 9 7 3 8 2 9 4 10 1 Darstellung von A als Baum: 1 16 14 2 10 4 8 2 8 7 4 9 5 9 3 6 3 7 1 10 Keine neue Datenstruktur nötig, sondern nur Funktionen parent, left, right mit den Eigenschaften parent(i) = b 2i c left(i) = 2i right(i) = 2i + 1 (Vorgänger) (linker Nachfolger) (rechter Nachfolger) Definition 4.4 Ein Array mit den Funktionen left, right, parent heisst heap, wenn gilt A[parent(i)] ≥ A[i] Definition 4.5 Die Höhe eines Knotens i in einem Baum ist gleich der Zahl der Knoten im längsten Pfad von i zu einem Blattknoten. Die Höhe des Baumes ist gleich der Höhe des Wurzelknotens. Der folgende Algorithmus verwandelt einen Binärbaum in einen Heap unter der Voraussetzung, dass beide Unterbäume schon Heaps sind. Heapify(A,i) vertausche A[i] mit seinem größten Nachfolger A[largest] falls A[largest] > A[i] heapify (A,largest) Beispiel 4.7 1 16 3 10 2 4 4 14 5 7 8 9 10 2 8 1 1 16 1 16 6 7 9 3 3 10 2 14 4 4 5 7 6 7 9 3 3 10 2 14 4 8 5 7 8 9 10 2 4 1 8 9 10 2 8 1 51 6 7 9 3 Der Algorithmus Heapify(A,i) l = Left(i) r = Right(i) if l ≤ heapsize(A) AND A[l] > A[i] then largest = l else largest = i if r ≤ heapsize(A) AND A[r] > A[largest] then largest = r if largest 6= i then vertausche A[i] mit A[largest] Heapify(A, largest) Laufzeit von heapify Vergleich von A[i] mit A[lef t(i)] und A[right(i)]: konstante Zeit= Θ(1) Rekursion maximale Zahl von Knoten in einem der Unterbäume left(i), right(i) = 23 n, wenn n = Zahl der Unterknoten in i. Rekurrenzrelation 2 T (n) ≤ T ( n) + Θ(1) 3 Das Auflösen der Rekurrenzrelation erfolgt mit Hilfe des Mastertheorems: Satz 4.4 (Mastertheorem) Seien a ≥ 1, b > 1 Konstanten und f : R+ → R+ , T : R+ → R+ Funtionen mit T (n) = aT (n/b) + f (n) wobei n/b für die ganzzahlige Division (bn/bc beschränkt werden durch Θ(nlogb a ) falls logb a Θ(n log n) falls T (n) = Θ(f (n)) falls oder dn/be) steht. Dann kann T (n) asymptotisch ∃ε>0 : f (n) = O(nlogb a−ε ) f (n) = Θ(nlogb a ) ∃ε>0 : f (n) = Ω(nlogb a+ε ) und ∃c<1 ∃n0 ∀n≥n0 : af (n/b) ≤ cf (n) Für Heapsort gilt T (n) ≤ T ( 32 n) + Θ(1). Für den Worst Case gilt n Tmax (n) = 1 · T +c 3/2 Für die Anwendung des Mastertheorems gilt dann also a = 1, b = 32 , f (n) = 1 sowie nlogb a = n log 3 1 2 =1 Es ist der zweite Fall anwendbar, denn f (n) = Θ(nlogb a ). Also gilt für heapify Tmax (n) = Θ(1 · log n) = Θ(log n). 52 Beispiel 4.8 Anwendung des Master-Theorems auf Quicksort (Best Case): T (n) = 2 T ( n2 ) + c · n a = 2, b = 2, f (n) = c · n nlogb a = nlog2 2 = n f (n) = Θ(n) ⇒ 2. Fall: T (n) = Θ(n · log n) Beispiel 4.9 wie oben, jedoch mit anderem f (n): T (n) = 2T ( n2 ) + c · log n a = 2, b = 2, f (n) = c · log n nlogb a = n f (n) = c · log n = O(n(1−ε) ) ⇒ 1. Fall: T (n) = Θ(n) 4.3.1 Erzeugen eines Heap Build-Heap(A) length(A) c downto 1 for i = b 2 do heapify(A,i) Beispiel 4.10 1 4 1 4 2 1 4 2 3 3 5 6 7 16 9 10 2 1 4 14 1 4 4 14 8 9 10 2 8 1 2 1 5 6 7 16 9 10 4 14 6 7 9 3 2 14 4 8 3 10 5 7 6 7 9 3 8 9 10 2 4 1 Analyse obere Schranke Jeder der Θ(n) Aufrufe von heapify kostet O(log n) Zeit. Also gilt =⇒ T (n) = O(n log n). 53 3 10 5 6 7 16 9 3 8 9 10 2 8 7 1 16 3 10 5 7 3 3 8 9 10 2 8 7 8 9 10 14 8 7 2 16 1 4 bessere Schranke Die Laufzeit von heapify hängt von der Höhe des Knotens im Baum ab. Die meisten Knoten haben sehr niedrige Höhe! (Zahl der Knoten auf Höhe h) ≤ d n 2h+1 e Die Laufzeit von heapify für Knoten der Höhe h wächst linear mit h. Also Theapif y (h) = O(h) = O(log(Anzahl Knoten im Unterbaum)) blog nc blog nc l m X X h n · O(h) = On = O(2n) = O(n) T (n) ≤ h+1 2 2h h=0 h=0 Die vorletzte Gleichung gilt weil ∞ 1 X h 2 = 1 2 = 2, h 2 ) (1 − 2 h=0 was man in der Formelsammlung findet. 4.3.2 Der Heapsort - Algorithmus Voraussetzung: Build-Heap setzt maximales Element an die Wurzel, d.h. in A[1] Idee Wiederhole folgende Schritte bis der Heap nur noch aus einem Element besteht: 1.) vertausche A[1] mit A[n] 2.) lösche A[n] aus dem Heap 3.) Heapify (A,1) Beispiel 4.11 14 8 4 2 8 10 2 10 4 7 1 9 1 5 9 3 6 8 3 7 16 10 4 2 8 i 4 10 8 5 1 2 4 10 8 4 14 9 3 1 3 6 8 3 7 16 10 6 9 7 10 8 10 8 16 10 5 4 2 14 9 8 6 3 1 9 7 4 10 8 4 3 7 14 9 5 1 3 6 2 7 16 10 4 14 9 4 3 i 5 8 3 6 2 9 7 16 10 8 16 10 5 6 3 2 9 7 4 4 14 9 8 3 6 9 7 16 10 1 i 10 8 54 7 i 3 5 3 i 4 14 9 1 2 1 2 7 1 10 8 2 1 2 1 2 1 2 7 1 4 1 i 4 i 16 10 3 i 5 7 3 2 14 9 7 1 2 4 9 i 8 7 9 2 4 14 9 1 1 2 3 7 16 10 5 8 6 3 9 7 Algorithmus Heapsort(A) Build-Heap(A) for i= length(A) downto 2 do vertausche A[1] mit A[n] heapsize(A)= heapsize(A)-1 Heapify(A,1) Analyse Build-Heap: T (n) = O(n) for-Schleife: (n − 1) mal Heapify mit T (n) = O(log n) und Vertauschen mit O(1) T (n) ≤ c1 · n + (n − 1) · [c2 · log n + c3 ] = c2 · n log n + (c1 + c3 ) · n − c2 log n − c3 {z } | vernachlässigbar für n → ∞ = O(n log n) 4.3.3 Priority-Queues als Anwendung der Heap-Struktur Bei der Verwaltung von Warteschlangen mit Aufträgen unterschiedlicher Priorität muß als jeweils nächster Auftrag immer ein Auftrag mit höchster Priorität ausgewählt werden. Dies kann zum Beispiel erreicht werden, indem man die Aufträge in einer sortierten Liste speichert. Allerdings ist dann die Komplexität zum Speichern der Aufträge in der Liste linear in der Länge n. Verwendet man dagegen einen Heap zur Verwaltung der Warteschlangen von Aufträgen, so ist die Komplexität zum speichern und holen von Aufträgen im Heap logarithmisch in n. Beispiel 4.12 Einfügen eines Elements x im Heap Idee 1.) neues Blatt erzeugen 2.) Pfad vom Blatt zur Wurzel durchsuchen und x an der richtigen Stelle einfügen. Algorithmus Heap-Insert(A, key) heapsize(A) = heapsize(A)+1 i=heapsize(A) while i>1 AND A[parent(i)] < key do A[i] = A[parent(i)] i=parent(i) A[i]=key Beispiel 4.13 Anwendung von Heap-Insert zum Einfügen des Elements X = 15 55 1 16 1 16 2 14 4 8 2 14 3 10 5 7 6 7 9 3 5 7 4 8 1 16 1 16 4 8 3 10 2 15 3 10 5 14 6 7 9 3 8 9 10 11 2 4 1 X 8 9 10 2 4 1 2 X 3 10 5 14 4 8 6 7 9 3 6 7 9 3 8 9 10 11 2 4 1 7 8 9 10 11 2 4 1 7 Analyse T (n) = O(log n). 4.4 Sortieren in linearer Zeit Unter ganz bestimmten Bedingungen ist Sortieren sogar in linearer Zeit möglich, wie man an folgendem Beispiel erkannt. Idee Wenn alle in der Liste A vorkommenden Sortierschlüssel aus einer bekannten endlichen Menge sind, kann man durch einfaches Abzählen der Häufigkeiten aller in A vorkommenden Elemente eine Tabelle S der Häufigkeiten erstellen. Danach wird die Liste A überschrieben mit den Elementen in der richtigen Reihenfolge (siehe Beispiel). Beispiel 4.14 Zu sortieren sei A = (2, 1, 4, 5, 4, 7, 3, 1, 4, 4, 1). Als Häufigkeitstabelle S erhält man Sortierschlüssel 1 Häufigkeit 3 2 3 1 1 4 5 4 1 6 0 7 1 Daraus erhält man einfach die sortierte Liste A = (1, 1, 1, 2, 3, 4, 4, 4, 4, 5, 7). Komplexität Mit m = |S| entsteht beim Abzählen ein linearer Aufwand und beim Zurückschreiben auch und man erhält T (n) = c1 · n + c2 · m + c3 · n = Θ(n + m) 56 Dieser Algorithmus ist besonders interessant, wenn die Zahl m der verwendeten Sortierschlüssel klein ist, zum Beispiel beim Sortieren einer großen Adressdatei nach Postleitzahlen. Das hier verwendete Verfahren setzt voraus, dass die Menge der verwendeten Schlüssel bekannt ist. Daher ist der aufwändige Vergleichen der Sortierschlüssel nicht nötig. Ist diese Voraussetzung jedoch nicht erfüllt und auch sonst kein Zusatzwissen über die zu sortierenden Daten vorhanden, so ist Sortieren in linearer Zeit nicht möglich und man kann für die Komplexität folgende untere Schranke angeben: Satz 4.5 Wenn ein Sortieralgorithmus für beliebige Listen nur mit Vergleichen und Kopieren arbeitet und keine Zusatzinformation über die Liste erhält, dann gilt: T (n) = Ω(n log n) 57 Kapitel 5 Algorithmen auf Graphen 5.1 Einführung Graphen werden immer dann verwendet, wenn man eine Menge von Objekten und Relationen zwischen diesen Objekten darstellen und/oder untersuchen will. Verkehrsnetze werden z.B. oft als Graph modelliert: Bay F N Ma Ka Reg Ul S Pa Li M Rv Ba Ros Sal Z Be Inn Definition 5.1 Ein gerichteter Graph ist ein Paar G = (V, E), bestehend aus einer endlichen Knotenmenge V (engl. vertex) und einer zweistelligen Relation E ⊆ V ×V . Die Elemente von E werden Kanten (engl. edge) genannt. G0 = (V 0 , E 0 ) ist ein Teilgraph von G = (V, E), wenn V 0 ⊆ V und E 0 ⊆ E. Beispiel 5.1 folgendes sind Graphen: • V1 = Menge aller Städte in Süddeutschland E1 = {(x, y) ∈ V1 × V1 |es gibt eine direkte Straßenverbindung von x nach y} • V2 = Menge der Einwohner von Ravensburg E2 = {(x, y) ∈ V2 × V2 |x kennt y} • V3 = Menge der Einwohner von Ravensburg E3 = {(x, y) ∈ V3 × V3 |x ist verheiratet mit y} G3 = (V3 , E3 ) ist Teilgraph von G2 = (V2 , E2 ) Zur graphischen Darstellung von Graphen werden Knoten durch Punkte und jede Kante (x, y) durch einen Pfeil von x nach y dargestellt. 58 Beispiel 5.2 c V = { a, b, c, d, e, f, g, h } E = { (a, d), (d, a), (a, b), (b, c), (c, a), (b, e), (a, e), (f, g), (f, f ) } h b d f a g e Definition 5.2 Falls für jede Kante e = (x, y) ∈ E eines Graphen G = (V, E) auch die Kante e = (y, x) ∈ E ist, so heißt G ungerichteter Graph. Alle anderen Graphen sind gerichtet. Beim Zeichnen von ungerichteten Graphen wird für jedes verbundene Knotenpaar nur eine Linie ohne Pfeile gezeichnet. Beispiel 5.3 G = (V, E) mit V = Menge von Städten in Süddeutschland, E = {(x, y) ∈ V1 × V1 | es gibt eine direkte Straße von x nach y (keine Einbahnstraße!)} Definition 5.3 • Sei G = (V, E) ein Graph. Ein Pfad (oder Weg) von Knoten x ∈ V nach y ∈ V ist eine Folge (x = a0 , . . . , a` ) von Knoten mit (ai , ai+1 ) ∈ E. ` ist die Länge des Weges von x nach y. • In einem einfachen Pfad kommt jeder Knoten höchstens einmal vor. • Ein Pfad der Länge ` ≥ 1 von x nach x heißt Kreis. • Ein Kreis, in dem kein Knoten mehr als einmal vorkommt, heißt Zyklus. • Ein gerichteter Graph G = (V, E) heißt zyklenfrei oder gerichteter azyklischer Graph (engl. directed acyclic graph (DAG)), wenn er keine Zyklen enthält. • (x, x) und (x, y, x) heißen triviale Zyklen. Ein ungerichteter Graph ist zyklenfrei, wenn es zwischen jedem Paar von Knoten (x, y) höchstens einen Pfad (ohne triviale Zyklen) gibt. • Die Zahl der Kanten, die von einem Knoten v ausgehen oder in ihm enden heißt Grad des Knotens. Er wird mit deg(v) bezeichnet. Beispiel 5.4 Für den Graphen aus Beispiel 5.2 gilt: • (b, c, a, d, a) ist ein Pfad von b nach a. • (c, a, b, e) ist ein einfacher Pfad von c nach e. c • (f, f, f, g) ist ein Pfad. f a • Er enthält u.a. den Kreis (a, b, c, a, d, a). • ({a, b, c, e}, {(a, b), (b, c), (b, e), (a, e)}) ist ein azyklischer Teilgraph von G. • deg(a) = 5, deg(b) = deg(f ) = 3, deg(h) = 0. 59 h b • (a, b, c, a) und (a, d, a) und (f, f ) sind die einzigen Zyklen. d e g Definition 5.4 • Ein ungerichteter Graph G heißt zusammenhängend, wenn es zwischen je zwei beliebigen Knoten einen Weg gibt. • Ein zusammenhängender zyklenfreier Graph ist ein Baum. • Eine Gruppe paarweise nicht zusammenhängender Bäume heißt Wald. • Ein Kreis heißt Eulerkreis, wenn er jede Kante des Graphen genau einmal durchläuft. 5.2 Eulerkreise Beispiel 5.5 Die Stadt Königsberg (heute Kaliningrad, Rußland) hatte folgenden Verlauf des Flusses Pregel mit sieben Brücken. Leonhard Euler fragte sich 1736, ob es einen Rundweg durch die Stadt gibt, auf dem jede Brücke genau einmal überquert wird. Der zugehörige Graph ist rechts angegeben. C A D B Satz 5.1 Ein ungerichteter zusammenhängender Graph enthält genau dann einen Eulerkreis wenn der Grad jedes Knotens gerade ist. Beweis: (Beweisskizze) “⇒”: Wird ein Knoten besucht, so über eine ankommende und eine abgehende Kante. Bei jedem Besuch eines Knoten auf dem Eulerkreis werden also zwei Kanten “verbraucht”. “⇐”: Sei G ein Graph in dem alle n Knoten geraden Grad haben. Weil der Graph zusammenhängend ist, muss der Grad aller Knoten mindestens 2 sein. Dann besitzt der Graph also mindestens n Kanten und damit einen Zyklus. Nun konstruieren wir einen Eulerkreis mit folgendem Algorithmus: Wir starten bei einem Knoten und traversieren den Graphen so lange bis ein Knoten vorkommt, der schon besucht wurde. Nun ist ein Kreis C gefunden. Alle Kanten von C werden nun gelöscht. Im verbleibenden Graphen wird dieses Verfahren fortgesetzt, bis alle Kanten besucht sind. Nun ist der Graph in disjunkte Zyklen zerlegt. Diese lassen sich leicht zu einem Eulerkreis verbinden. Haben zwei Kreise einen Knoten gemeinsam, so starten wir auf einem Kreis bis wir einen gemeinsamen Knoten V finden, verfolgen dann den zweiten Kreis von V bis wieder zu V und traversieren dann den Rest des ersten Kreises. Wir haben nun einen Kreis der beide Kreise zu einem neuen verbindet. Dieses Verfahren wird rekursiv fortgesetzt, bis alle alle Zyklen zu einem Eulerkreis verbunden sind (siehe Abbildung). 2 60 Der im Beweis skizzierte Algorithmus arbeitet in linearer Zeit. Das heißt, bei einem Graphen mit geradem Grad und m Knoten gilt für die Rechenzeit T (m) = Θ(m). 5.3 Datenstrukturen für Graphen 5.3.1 Rv Ul M S Ka Z Ba Be F Ma N Adjazenzmatrix Rv Ul M S Ka Z Ba Be F Ma N x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x F N Ma Ka Ul S M Rv Ba Z Be Die Matrix ist symmetrisch. Warum? 5.3.2 Adjazenzlisten a b c d e 0 f g 0 h 0 b c a 0 a 0 e e 0 f g 0 d 0 c f a h b d 61 e g 5.3.3 Liste von Adjazenzlisten a b e b c e 0 c a 0 d 0 c d a 0 f a f h b e 0 f d g 0 e g g 0 h 0 0 5.3.4 Vergleich der drei Datenstrukturen Adjazenzmatrix Adjazenzlisten Liste von Adjazenzlisten Vorteile Berechnung der Inzidenz mit O(1) Speicherplatz = O(n + m) Nachteile Speicherplatz und Initialisierung teuer, beide O(n2 ) Berechnung der Inzidenz mit O(m) Speicherplatz = O(n + Berechnung der Inzidenz m), Knoten können einfach mit O(m), Knotensuche mit gelöscht oder hinzugefügt O(n) werden n = Knotenzahl, m = Kantenzahl 5.4 Kürzeste Wege Definition 5.5 Ein gewichteter Graph (auch bewerteter Graph) ist ein Tripel G = (V, E, w), bestehend aus einem Graphen (V,E) zusammen mit einer Gewichtungsfunktion w : E → R+ , die jeder Kante eine relle Zahl zuordnet. Die Länge eines Weges (x = a0 , . . . , a` ) ist `−1 X w(ai , ai+1 ). i=0 62 Beispiel 5.6 Entfernungstabelle einiger süddeutscher Städte RV Ul M S Ka Rv 0 86 178 195 – Ul 0 123 107 – M 0 – – S 0 64 Ka 0 Z Ba Be F Ma N Z 91 – – – – 0 Ba Be F Ma 180 – – – – – – – – – – – – – 210 135 191 – – 67 85 120 – – 0 91 – – 0 – – 0 85 0 N – 171 170 210 – – – – 230 230 0 F 230 85 230 Ma 67 135 Ka 107 S 64 210 171 123 170 86 180 Be Ul 195 191 Ba N 210 85 91 120 Z 91 RV 178 M Wegen der Symmetrie kann die untere Dreiecksmatrix weggelassen werden. Definition 5.6 Ein Baum T = (V, E 0 ), der alle Knoten V eines Graphen G = (V, E) enthält, heißt minimal aufspannender Baum, wenn die Summe aller Kantengewichte minimal ist, d.h. wenn X E 0 = argminX⊂E w(e). e∈X 5.4.1 Der Kruskal-Algorithmus Satz 5.2 (Kruskal-Algorithmus) Für einen ungerichteten, zusammenhängenden, bewerteten Graphen findet der folgende Algorithmus einen minimal aufspannenden Baum T : 1. Setze T = {}, i = 0 2. Sortiere die Kanten nach ihrem Gewicht. 3. Wähle aus den noch nicht gewählten Kanten die mit dem kleinsten Gewicht. Falls diese Kante in T keinen Zyklus erzeugt, erweitere T um diese Kante. Wiederhole Schritt 3 bis alle Kanten verbraucht sind. Beispiel 5.7 Wir wenden nun den Kruskal-Algorithmus auf obiges Beispiel an und erhalten folgenden minimal aufspannenden Baum: 63 F 230 85 230 Ma 210 67 135 Ka 210 171 123 195 191 170 86 180 Be Ul 107 S 64 Ba N 85 91 120 Z 91 RV 178 M Satz 5.3 Die Laufzeit des Kruskal-Algorithmus ohne Sortieren für einen Graphen mit n Knoten und m Kanten ist O(m + n log n). Mit optimierten Datenstrukturen ist (ohne Sortieren) sogar eine fast lineare Komplexität erreichbar [9]. Definition 5.7 Gegeben sei ein bewerteter Graph G = (V, E, w). • Beim Single Pair Shortest Path Problem (SPP) ist ein kürzester Weg von einem Knoten a zu einem Knoten b gesucht. • Beim Single Source Shortest Path Problem (SSP) sind kürzeste Wege von einem Knoten a zu allen anderen Knoten b ∈ V gesucht. • Beim All Pairs Shortest Path Problem (APSP) ist für jedes Paar von Knoten (a, b) ein kürzester Weg gesucht. 5.4.2 Der Dijkstra-Algorithmus Wir geben nun einen bekannten Algorithmus für das SSP an: Satz 5.4 (Dijkstra-Algorithmus) Für einen bewerteten Graphen G = (V, E, w) und einen gegebenen Knoten a findet der folgende Algorithmus einen aufspannenden Baum, der das SSPProblem für den Knoten a löst. Hierbei ist δ(S) = {k ∈ V \S|k ist mit einem Knoten aus S direkt verbunden.} Dijkstra(G,a) Setze S = {}, F = {} while S 6= V do suche in δ(S) den Knoten v mit dem kürzesten Pfad (a, . . . , u, v) von a zu v. S = S ∪ {v} F = F ∪ {(u, v)} 64 Beispiel 5.8 Dijkstra-Algorithmus mit a = Rv: F 230 85 230 Ma Ka 64 S 107 Be 91 Knoten in δ (S): 171 170 123 Kanten in F: 120 M 178 85 86 180 Ul 195 191 Ba 210 Knoten in S: N 67 135 210 Z 91 RV = a S F 230 85 230 Ma 210 67 135 Ka 107 S 64 210 171 123 170 86 180 Be Ul 195 191 Ba N 85 91 120 Z 91 RV 178 M Satz 5.5 Die Laufzeit des Dijkstra-Algorithmus O(m + Cn), wobei C eine Konstante ist, die vom maximalen Kantengewicht abhängt [9]. 5.4.3 Anwendungen • “Städteverbindungen” der Bahn • Routing im Internet: Router berechnet die beste Route zum nächsten Backbone-Knoten über einen aufspannenden Baum, den er mit dem Dijkstra-Algorithmus erstellt. Definition 5.8 Ein Hamilton-Kreis (hamiltonian circle) in einem Graphen G ist ein ge schlossener Weg, in dem jeder Konten aus G genau einmal vorkommt. Eine Clique in einem (ungerichteten) Graphen ist ein vollvernetzter Teilgraph. 5.5 Das Problem des Handlungsreisenden (traveling salesman problem, TSP) 65 gegeben: Menge von Städten s1 , . . . , sn und eine Entfernungstabelle d mit dij = |si − sj | = Entfernung zwischen Stadt i und Stadt j. gesucht: Eine Permutation (Vertauschung) Π von (s1 , . . . , sn ), so dass n−1 X wΠ(i),Π(i+1) + wΠ(n),Π(1) i=1 minimal ist. Es ist also eine Route gesucht, die jede Stadt genau einmal besucht und am Ende wieder im Ausgangspunkt endet. k Definition 5.9 Eine bijektive Abbildung einer Menge M auf sich selbst heißt Permutation. Beispiel 5.9 Eine Permutation der Menge {1, . . . , 6} i 1 2 3 4 5 6 Π(i) 4 2 1 3 5 6 5.5.1 Ein praktisches Ergebnis TSP-Tour durch mehr als 15112 deutsche Städte: 66 David Applegate, Robert Bixby und William Cook von der Rice-Universität in Houston (Texas) sowie Vasek Chvatal von der Rutgers-Universität in New Brunswick (New Jersey), 1998, siehe: www.tsp.gatech.edu 5.5.2 Der Nearest-Neighbour-Algorithmus Idee Starte in einem Knoten und wähle als nächsten immer den mit dem geringsten Abstand. Algorithmus NN TSP(D) For i=1 To n Do tour[i]=i tour[n+1]=1 For i=2 To n-1 Do next=argmin{D[i − 1, j]|j ∈ tour[i...n]} vetimesrtausche tour[i] mit tour[next] Return(tour) 67 Komplexität T (n) = Θ(n2 ) 5.5.3 Der Greedy - Algorithmus Idee “Greedy” heißt auf deutsch “gierig”. Dieses Attribut trifft auf den Algorithmus sehr gut zu, denn er greift gierig immer nach der “besten” Kante ohne auf das Gesamtresultat zu schauen. Algorithmus • sortiere alle Kanten in der Liste K • Sei (v, v 0 ) die Kante aus K mit kleinstem Gewicht. Falls deg(v) < 2 und deg(v 0 ) < 2 und (v, v 0 ) schließt keinen Zyklus mit ≤ n Knoten, erweitere die Tour um (v, v 0 ) und lösche (v, v 0 ) aus K. • Wiederhole 2. bis für alle v ∈ V deg(v) = 2. Komplexität T (n) = Θ(n2 log n) Beispiel 5.10 Vergleich von 2 Heuristiken mit der optimalen Lösung an einem ganz einfachen Beispiel: a 6 1 b 3 f 5 4 e a c 2 d 3 Greedy Algorithmus b f 4 2 e 1 6 a 5 c b f e c d d Nearest Neighbour (Start in d) Beispiel 5.11 Vergleich von 3 Heuristiken mit der optimalen Lösung: 68 optimale Tour 5.5.4 Optimaler Algorithmus Optimal TSP Idee berechne für jede Tour Pn i=1 wtour[i],tour[i+1] und wähle eine Tour mit minimalem Wert. Komplexität ohne Beschränkung der Allgemeinheit ist die erste Stadt frei wählbar. zweite Stadt: n − 1 Möglichkeiten dritte n − 2 Möglichkeiten ... n-te Stadt: eine Möglichkeit T (n) = c · (n − 1)! = Θ((n − 1)!) (n − 1)! = (n − 1)(n − 2) . . . 1 ≤ (n − 1)n−1 n! ≤ nn = n · n . . . n =⇒ T (n) = O(nn−1 ) 69 5.5.5 Stirling’sche Formel ⇒ √ n n! ≈ ( )n · 2Πn für n → ∞ e √ n T (n) = Θ(( )n−1 · n) e =⇒ überexponentielles Wachstum Resultate 1.) Fachleute sind überzeugt, daß es keinen polynomiellen Alg. für TSP gibt! 2.) und dass es sogar für fast optimale Lösungen keinen polynomiellen Alg. gibt. 3.) für TSP mit Dreiecksungleichung gibt es einen fast optimalen Alg. mit T (n) = O(n2 ) Dreiecksungleichung: ∀i, j, k wij ≤ wik + wkj i Diese Gleichung besagt, dass die direkte Verbindung zwischen zwei Städten immer minimale Länge hat. Sie gilt zum Beispiel für Luftlinienverbindungen zwischen Städten. Für die Entfernungen auf Straßen gilt sie jedoch nicht immer. j dij djk d ik k Wachstum der Rechenzeit von Optimal TSP Folgende Tabelle veranschaulicht das extrem schnelle Wachstum der Rechenzeit von Optimal TSP. Heute ist das TSP-Problem mit optimierten Algorithmen für etwa 30 Städte lösbar. Wie man an der Tabelle erkennt, ist der Aufwand für 40 Städte etwa um den Faktor 1016 höher und damit also unerreichbar. n 10 20 30 40 50 5.5.6 (n-1)! 362880 121645100408832000 8841761993739701954543616000000 20397882081197443358640281739902897356800000000 608281864034267560872252163321295376887552831379210240000000000 (n-1)! 3.6 · 105 1.2 · 1017 8.8 · 1030 2.0 · 1046 6.1 · 1062 Die Minimum-Spanning-Tree-Heuristik Definition 5.10 Ein Preorder-Tree-Walk traversiert einen Baum folgendermassen: Be ginnend mit dem Wurzelknoten werden von links nach rechts rekursiv alle Nachfolgerknoten besucht. 70 Beispiel 5.12 Angewendet auf den minimal aufspannenden Baum mit Wurzelknoten Bern ergibt sich: F 230 85 230 Ma 210 67 135 Ka 210 171 123 195 191 170 86 180 85 Z 91 Be Ul 107 S 64 Ba N 120 91 M 178 RV Listet man nun alle besuchten Städte in der besuchten Reihenfolge und löscht alle Wiederholungen so ergibt sich ein einfacher Pfad, der alle Knoten besucht. F 230 85 230 Ma 67 135 Ka 107 S 64 210 171 123 170 86 180 Be Ul 195 191 Ba N 210 85 91 120 Z 91 RV 178 M Im Fall eines voll vernetzten Graphen läßt sich dieser Pfad durch eine Verbindung von Frankfurt nach Bern zu einem Hamilton-Kreis schließen und man erhält eine Näherungslösung für das TSP-Problem. Dieses heuristische Vorgehen nennt man die Minumum-Spanning-TreeHeuristik. Ist der Graph nicht vollständig vernetzt, wie im Beispiel, so ist es durchaus möglich, dass es keinen Hamilton-Kreis gibt. Der minimal aufspannende Baum liefert jedoch auch hier einen guten Ausgangspunkt für eine Näherung zur Lösung des TSP-Problems. 71 F 230 85 230 Ma 210 67 135 Ka 107 S 64 5.6 210 171 123 170 86 180 Be Ul 195 191 Ba N 85 91 120 Z 91 RV 178 M Planare Graphen Definition 5.11 Läßt sich ein Graph in der Ebene darstellen, ohne dass sich Kanten kreuzen, so nennt man ihn planar. Die Menge der durch die Kanten begrenzten Flächenstücke wird mit A bezeichnet. Beispiel 5.13 Zwei planare Darstellungen des vollständigen Graphen mit vier Knoten: Für diesen Graphen gilt |A| = 4. Satz 5.6 (Eulerformel) Für jeden planaren zusammenhängenden Graphen G = (V, E) gilt |V | − |E| + |A| = 2. Beweis: Falls G ein Baum ist gilt |V | = |E| + 1 und |A| = 1 und es ergibt sich |V | − |E| + |A| = |E| + 1 − |E| + 1 = 2. Für den Fall, dass G kein Baum ist zeigen wir die Behauptung per Induktion über die Zahl der Kanten n = |E|. Für n = 0 besteht der Baum aus einem Knoten, d.h. es gilt |V | = 1, |E| = 0, |A| = 1 und die Formel stimmt. Wir nehmen an, die Formel gilt für n > 0. Nun fügen wir eine Kante hinzu und erzeugen den neuen Graphen G0 = (V 0 , E 0 ) mit |V 0 | = |V | und |E 0 | = |E| + 1. Die neue Kante schließt einen Kreis und es gilt |A0 | = |A| + 1, woraus |V 0 | − |E 0 | + |A0 | = |V | − (|E| + 1) + |A| + 1 = |V | − |E| + |A| = 2 2 folgt. 72 Kapitel 6 Übungen 6.1 Geschichte der Informatik Aufgabe 1 Recherchieren Sie in Ihrer Lerngruppe über eine(n) berühmten Informatiker(in) und bereiten Sie ein kurzes Referat vor. In der Übungsstunde tragen Sie darüber vor. Beachten Sie dabei bitte folgendes: • Versuchen Sie zu verstehen (und im Vortrag darzustellen), was die von Ihnen gewählte Person erfunden/geleistet hat. • Berichten Sie auch über die Persönlichkeit und das Privatleben. • Versuchen Sie sich kurz zu halten, aber trotzdem das Wesentliche zu vermitteln. • Arbeiten Sie mit Farbe, Anschauung, Bildern. 6.2 Endliche Automaten Aufgabe 2 Konstruieren sie (deterministische oder nichtdeterministische) endliche Automaten für folgende Sprachen: a) Die Menge der Dezimalzahlen mit beliebig vielen Dezimalziffern vor dem Dezimalpunkt und beliebig vielen (mindestens einer) Dezimalziffern nach dem Dezimalpunkt. Aufgabe 3 Es soll eine Fußgängerampel mit Hilfe eines endlichen Automaten programmiert werden. Die Ampel hat die zwei Zustände rot und grün (aus der Sicht des Fahrzeugs). Im Zustand rot akzeptiert die Ampel Signale von der Kontaktschleife auf der Straße und schaltet dann auf Grün. Im Zustand Grün akzeptiert die Ampel Signale vom Fußgängertaster und schaltet auf Rot. Alle anderen Eingaben ignoriert der Automat. a) Geben Sie einen endlichen Automaten für diese Aufgabe an. b) Zeichnen Sie ein Zustandsdiagramm zu diesem Automaten. c) Geben Sie einen regulären Ausdruck für diese Sprache an. d) Geben Sie eine reguläre Grammatik für diesen Automaten an. 73 e) Zeigen Sie, dass diese Ampelschaltung bei geringem Verkehrsaufkommen das Mehrheitsprinzip exakt erfüllt, das heisst, das Verhältnis aus rot- zu grün-Zuständen ist gleich dem Verhältnis aus Fußgängerzahl zu Autofahrerzahl. Aufgabe 4 Es soll ein Getränkeautomat mit Hilfe eines endlichen Automaten programmiert werden. Der Automat kann mit bis zu 4 Dosen Mineralwasser, 4 Dosen Limo und 4 Dosen Bier gefüllt werden. Wenn eine 1-Euro-Münze eingegeben wird, soll er eine Dose des gewählten Getränks ausgeben. Bei Eingabe einer anderen Münze soll er die eingegebene Münze wieder ausgeben, aber kein Getränk. Wenn von einer Getränkesorte alle Dosen ausgegeben sind, soll er anhalten und per Funk den Service benachrichtigen. a) Geben Sie einen endlichen Automaten (mit Ausgabe) für diese Aufgabe an. b) Zeichnen Sie ein Zustandsdiagramm zu diesem Automaten. c) Geben Sie einen regulären Ausdruck für diese Sprache an. d) Geben Sie eine reguläre Grammatik an, welche die für diesen Automaten erlaubte Eingabesprache akzeptiert. 6.3 Sortieren Sortieren durch Einfügen Aufgabe 5 a) Programmieren Sie “Sortieren durch Einfügen” in C für Integerzahlen - Arrays. b) Testen Sie das Programm mit sortierten, zufälligen und umgekehrt sortierten Arrays auf Korrektheit. c) Bestimmen Sie für sortierte, zufällige und umgekehrt sortierte Arrays die Parameter a, b und c von T (n) = a · n2 + b · n + c. Da in der Sprache C die Länge statischer Arrays auf 250000 beschränkt ist, sollten Sie mit dynamischen Arrays arbeiten. Das geht (mit C++) z.B. so: /* Deklaration Array */ int* a; n = 300000000 /* Speicherplatz reservieren */ a = new int[n]; d) Bestimmen Sie die theoretische Rechenzeit für ein Array der Länge 5 · 109 . e) Warum wird in der Praxis T (5 · 109 ) viel größer sein als oben errechneter Wert? f ) Durch welche Massnahme kann man die berechnete Rechenzeit tatsächlich erreichen? Quicksort Aufgabe 6 Skizzieren Sie den Rekursionsbaum von Quicksort für ein konstantes Aufteilungsverhältnis von 1:k und leiten Sie aus diesem Baum T (n) = O(n lg n) ab. 74 Aufgabe 7 Programmieren Sie Quicksort für einfache Arrays von Integer-Zahlen, indem Sie die Funktion Partition wie in der Vorlesung beschrieben implementieren. Zeigen Sie empirisch, daß für zufällig sortierte Arrays Trand (n) = Θ(n lg n) und für vorsortierte Arrays Tmax (n) = Θ(n2 ) gilt. Aufgabe 8 Beweisen Sie, daß für Sortieralgorithmen gilt Tmin (n) = Ω(n). Aufgabe 9 Gegeben sei folgender Programmteil eines C-Programms: for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) for(k = 1; k <= j; k++) z = z+1; a) Berechnen Sie die Laufzeit T (n) und geben Sie die (asymptotische) Zeitkomplexität an. b) Welchen Wert hat z nach Verlassen der äußersten Schleife für n = 100? Aufgabe 10 Gegeben sei die rekursive Funktion fib: fib(0) = 1 fib(1) = 1 fib(n) = fib(n − 1) + fib(n − 2) für n ≥ 2. a) Berechnen Sie fib(5). b) Zeichnen Sie den Rekursionsbaum für fib. c) Bestimmen Sie anhand des Rekursionsbaumes die Komplexität von fib. Heapsort Aufgabe 11 Zeigen Sie, daß gilt ∞ X k=0 kq k = q . (1 − q)2 Tip: Entweder Sie schreiben die Reihe gliedweise in geeigneter Form und wenden dann die Formel für die geometrische Reihe an, oder Sie starten indem Sie die Formel für die geometrische Reihe differenzieren. Aufgabe 12 Warum wird der Schleifenindex i in Zeile 2 von Build-Heap von blength[A]/2c bis 1 erniedrigt und nicht von 1 bis blength[A]/2c erhöht? 75 Aufgabe 13 Stellen Sie den Ablauf von Build-Heap für A = (5, 3, 17, 10, 84, 19, 6, 22, 9) grafisch dar, ähnlich wie in Beispiel 4.10. Aufgabe 14 Stellen Sie den Ablauf von Heapsort für A = (5, 13, 2, 25, 7, 17, 20, 8, 4) grafisch dar, ähnlich wie in Beispiel 4.11. Aufgabe 15 Benutzen Sie die Master-Methode zur Berechnung der Laufzeit der Suche durch Bisektion mit der Rekurrenzgleichung T (n) = T (n/2) + Θ(1). Aufgabe 16 Geben Sie mit Hilfe des Master-Theorems asymptotische Schranken für folgende Rekurrenzen an: a) T (n) = 4T (n/2) + n b) T (n) = 4T (n/2) + n2 c) T (n) = 4T (n/2) + n3 . 6.4 Graphen Aufgabe 17 Zeigen Sie, dass jeder zyklenfreie ungerichtete Graph ein Wald ist. Aufgabe 18 Zeigen Sie, dass in jedem Graphen G = (V, E) mit m Kanten X deg(v) = 2m v∈V gilt. Aufgabe 19 Konstruieren Sie für den Graphen aus dem Beweis von Satz 5.6 einen Eulerkreis, indem Sie mit anderen Zyklen beginnen. Aufgabe 20 Geben Sie für den bewerteten Süddeutschlandgraphen die Adjazenzlisten und die Liste von Adjazenzlisten an. Aufgabe 21 Geben Sie für den Graphen aus Beispiel 5.2 Adjazenzmatrix an. 76 Aufgabe 22 Erzeugen Sie einen minimal aufspannenden Baum mit dem Algorithmus von Kruskal für den SFBay-Graphen. Aufgabe 23 Verwenden Sie den Algorithmus von Dijkstra für das Single-Source-Shortest-Path-Problem beim SFBay-Graphen mit Start in Palo Alto. Aufgabe 24 Gegeben ist folgende Entfernungstabelle deutscher Städte: Br Aachen Basel Berlin Bremen Dortmund Dresden Düsseldorf 545 650 370 155 645 90 Aachen Do 875 775 555 745 550 Basel Be 400 495 200 560 Berlin Aa 235 490 285 Bremen 515 70 Dortmund Dü Dre 580 Dresden Ba a) Bestimmen Sie mit dem Greedy-Algorithmus eine Lösung für das TSP-Problem. Starten Sie in Düsseldorf. Geben Sie die Tour sowie deren Länge an. b) Bestimmen Sie einen Minimum Spanning Tree mit dem Kruskal-Algorithmus. Zeichnen Sie diesen in die Landkarte (unten) ein. c) Verwenden Sie die Minimum-Spanning-Tree-Heuristik mit Wurzelknoten Bremen zur Bestimmung einer Lösung des TSP-Problems. Zeichnen Sie die Lösung in die Karte ein und geben Sie Tour sowie Länge an. Aufgabe 25 Versuchen Sie, die Minimum-Spanning-Tree-Heuristik zur Lösung des TSP-Problems beim SFBay-Graphen anzuwenden. Vergleichen Sie das Ergebnis mit dem des Greedy-Algorithmus bei Start in San Franzisko oder anderen Städten. Warum treten hier Probleme auf? Aufgabe 26 Bestimmen Sie eine optimale Tour für das TSP-Problem beim SFBay-Graphen. Aufgabe 27 Für einen planaren (ebenen) ungerichteten Graphen sei A die Menge der durch die Kanten des Graphen begrenzten Flächenstücke. Überprüfen Sie an allen bisher verwendeten Graphen (V, E) die Gültigkeit der Euler-Formel |V | − |E| + |A| = 2. 77 Problem des Handlungsreisenden Aufgabe 28 Es soll ein Programm entworfen werden, das bei gegebener Abstandsmatrix für vollständig vollständige Graphen eine optimale Tour findet. a) Schreiben Sie ein Programm für Optimal TSP mit 4 Städten b) Schreiben Sie ein Programm für Optimal TSP mit n Städten 78 Kapitel 7 Lösungen zu den Übungsaufgaben 7.1 Geschichte der Informatik 7.2 Endliche Automaten Aufgabe 2 a) ({z0 , z1 , ze }, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, .}, δ, z0 , {ze }) wobei δ gegeben ist durch: z0 , 0 → z0 z0 , 1 → z0 z0 , 2 → z0 ... z0 , 9 → z0 z0 , . → z1 z1 , 0 → ze z1 , 1 → ze z1 , 2 → ze ... z1 , 9 → ze ze , 0 → ze ze , 1 → ze ze , 2 → ze ... ze , 9 → ze Aufgabe 3 a) ({r, g}, {e, f, a}, δ, z0 , {z0 }) wobei δ gegeben ist durch: r, f → r r, a → g g, f → r r, f → r b) c) [ab]* d) S → Sa, S → Sb, S → a, S → b Aufgabe 4 Der Automat ist ähnlich dem Automat mit den Mineralwasserdosen auf Seite S. 64 im Script. Beim Automat in der Aufgabe sind es drei Getränksorten (Mineralwasser, Bier und Limo). Dies würde dann ein Automat mit 53 (5 Zustände z0 bis z4 mit drei Sorten) werden. Da der Automat aufwendig zu zeichnen ist und die Zustandstabelle recht gross wird, führt man Indizes ein. Z.B. Si,j,k z.B. wobei i Mineralwasser, j Bier und k Limo ist. 79 7.3 Sortieren Sortieren durch Einfügen Aufgabe 5 a) Lösung des Programms b) siehe Programm c) Tabelle zur Ermittlung der Koeffizienten a,b,c über LGS aus Messungen 20 10 5 2 n absteigend aufsteigend zufällig 000 80 960 ms 28 940 ms 54 870 ms 000 27 460 ms 14 440 ms 20 980 ms 7 200 ms 8 790 ms 000 10 490 ms 500 4 400 ms 3 570 ms 4 010 ms absteigend (Worst Case): c = 40 b= 7220−30 5000 a= 80960−40−28760 400000000 = 1, 438 = 1, 304 · 10−4 aufsteigend (Best Case): c = −33, 3 b= 7205+25 5000 a= 28940−28920+12,5 400000000 = 1, 446 = 8, 125 · 10−8 zufällig (Average Case): c = −230 b= 7262,5+172,5 5000 a= 54870−29740+230 400000000 = 1, 487 = 6, 34 · 10−5 d) Worst Case: 1, 30 · 10−4 · (5 · 109 )2 + 1, 438 · 5 · 109 + 40 = 3, 26 · 1015 ms ≈ 103374 Jahre Best Case: 8, 125 · 10−8 · (5 · 109 )2 + 1, 446 · 5 · 109 − 33, 3̄ = 2, 04 · 2012 ms ≈ 65 Jahre Zufällig: 6, 34 · 10−5 · (5 · 109 )2 + 1, 487 · 5 · 109 − 230 = 1, 59 · 1015 ms ≈ 50260 Jahre e) In der Praxis wird der Wert viel größer wie der oben errechnete Wert, da es Hardwaregrenzen wie z.B. den Hauptspeicher gibt. Wenn dieser sein Maximum an Kapizität erreicht hat, muß er Daten auf die Festplatte auslagern, dies kostet Zeit. f ) Durch die Anpassung der Hardware. D.h. den Speicher ausreichend erweitern, und den Adressbus vergrössern. 80 Quicksort Aufgabe 6 n kn k+1 2 kn 2 (k + 1) n k+1 kn 2 (k + 1) kn n 2 2 (k + 1) (k + 1) Tiefe der untersten Ebene: dl k ·n=1 k+1 Rechenaufwand pro Ebene ≤ n k dl · log k+1 + log n = 0 dl = log n log k+1 k wegen T (n) ≤ n · dl folgt T (n) = O(n · log n) Aufgabe 7 Messungen: n 2000000 4000000 6000000 8000000 10000000 15000000 20000000 40000000 80000000 T(n) [sec] 1.1 2.47 3.5 4.76 5.84 9.41 12.72 26.98 55.46 Für n → ∞ gilt T (n) = Cn ln n, also C = T (n)/n ln n Man erhält also die folgende Tabelle und schließt daraus C ≈ 3.810−8 sec, d.h. T (n) ≈ 3.810−8 n ln nsec. n 2000000 4000000 6000000 8000000 10000000 15000000 20000000 40000000 80000000 T (n)/(n ln n) [sec] 3.79084 10−8 4.06202 10−8 3.73757 10−8 3.74333 10−8 3.62326 10−8 3.7966 10−8 3.78318 10−8 3.85332 10−8 3.80958 10−8 Aufgabe 8 Weil der Algorithmus auf jedes Element mindestens einmal zugreifen muß, um zu überprüfen, ob es an der richtigen Stelle steht. Ansonsten ist nicht garantiert, daß die gesamte Liste sortiert ist. Aufgabe 9 a) T (n) = n · n X j=1 j =n· n(n + 1) n 1 = (n2 + n) = (n3 + n2 ) = Θ(n3 ) 2 2 2 b) 1 6 1 (10 + 104 ) = 1.01 · 106 = 0.505 · 106 = 505000 2 2 81 Aufgabe 10 a) fib(5) = 8 b) c) Tiefe des Baumes: n, Zahl der Blätter: 2n Zahl der Knoten auf Ebene k: 2k Zahl der Knoten gesamt: n−1 X 2k = 2n − 1 k=0 Heapsort Aufgabe 11 Formel für geometrische Reihe: ∞ X qk = k=0 differenziert: ∞ X k=0 1 1−q ∞ k·q k−1 X 1 q = ⇒ k · qk = 2 (1 − q) (1 − q)2 k=0 Aufgabe 12 Heapify setzt voraus, dass die Unterbäume schon Heaps sind. Darum muß der Baum von unten nach oben in einen Heap umgewandelt werden. Aufgabe 13 tausche 22 mit 10 tausche 19 mit 17 tausche 3 mit 84 tausche 5 mit 84 tausche 5 mit 22 tausche 5 mit 10 82 Aufgabe 14 tausche 25 mit 13 tausche 20 mit 2 tausche 5 mit 25 tausche 5 mit 13 tausche 5 mit 8 tausche 25 mit 4 löse 25 aus Heap tausche 4 mit 20 tausche 4 mit 17 tausche 20 mit 5 löse 20 aus Heap tausche 17 mit 5 tausche 17 mit 2 löse 17 aus Heap tausche 13 mit 2 tausche 8 mit 2 tausche 13 mit 4 löse 13 aus Heap tausche 8 mit 4 tausche 7 mit 4 tausche 8 mit 4 löse 8 aus Heap tausche 7 mit 4 tausche 7 mit 2 löse 7 aus Heap tausche 5 mit 2 tausche 5 mit 2 löse 5, 4, 2 aus Heap Aufgabe 15 f (n) = 1nlog2 1 = n0 = 1 ⇒ F all2 ⇒ T (n) = Θ(n0 · log n) = Θ(log n) Aufgabe 16 a) f (n) = n nlog2 4 = n2 ⇒ Fall 1 T (n) = Θ(n2 ) b) f (n) = n2 nlog2 4 = n2 ⇒ Fall 2 T (n) = Θ(n2 · log n) c) f (n) = n3 nlog2 4 = n2 ⇒ Fall 3 T (n) = Θ(n3 ) 7.4 Graphen P Aufgabe 18 Die Summe v∈V deg(v) zählt die Endknoten aller Kanten des Graphen. Damit wird jede Kante zweimal gezählt. 83 Aufgabe 20 Aufgabe 22 Aufgabe 23 Nr 6 9 7 4 8 5 0 13 10 3 14 12 1 2 11 Name Palo Alto Santa Clara Fremont San Manteo San Jose Hayward San Francisco Half Moon Bay Scotts Valley Oakland Pacifica Santa Cruz San Rafael Richmond Watsonville Entfernung 0 10 15 18 25 29 38 43 45 49 53 55 56 64 85 Die angegebenen Nummern in der linken Spalte sind die Knoten, die zur Menge S schrittweise hinzugefügt werden. Aufgabe 24 Süddeutschlandgraph: a) Dü,Do,Aa,Br,Ber,Dre,Bas,Dü, Gesamtentfernung: 2490 b) siehe unten 84 c) Dü,Do,Br,Dre,Ber,Bas,Aa,Dü, Gesamtentfernung: 2505, siehe unten Br Do Aa Be Dü Dre spanning tree TSP−Tour mit Min.Sp.Tree−Heuristik Preorder−Tree−Walk Ba Aufgabe 25 Da es nur recht wenige Verbindungen in diesem Graph gibt, wundert es nicht, dass der Greedy-Algorithmus versagt. Aufgabe 26 Die Lösung auf das TSP-Problem beim SFBay-Graphen ist eindeutig und intuitiv: Die optimal Tour: 1 → 2 → 3 → 5 → 7 → 8 → 11 → 12 → 10 → 9 → 6 → 4 → 13 → 14 → 0 → 1 Aufgabe 27 V = Knoten; E = Kanten; A = Flächen; Problem des Handlungsreisenden 85 Literaturverzeichnis [1] Wikipedia – Die freie Enzyklopädie. www.wikipedia.org. 2.8.17 [2] F. Naumann. Vom Abakus zum Internet. Wissenschaftliche Buchgesellschaft, 2001. Geschichte der Informatik. 2.1 [3] H. Matis. Die Wundermaschine. mitp-Verlag, 2002. Geschichte des Computers. 2.1 [4] W. de Beauclair. Rechnen mit Maschinen – eine Bildgeschichte der Rechentechnik. Vieweg Verlag, 1968. Die Lektüre dieses Bilderbuches lohnt sich! 2.1 [5] D. Shasha and C. Lazere. Out of Their Minds: The Lives and Discoveries of 15 Great Computer Scientists. Copernicus/ An Imprint of Springer-Verlag, 1995. Sehr unterhaltsam und informativ. [6] V. Claus and A. Schwill. Duden Informatik. Bibliographisches Institut & F.A. Brockhaus AG, 1988. Ein gutes Nachschlagewerk zur Informatik allgemein. [7] P. Rechenberg and G. Pomberger. Informatik-Handbuch. Hanser Verlag, 2001. [8] C. Horn and O. Kerner. Lehr- und Übungsbuch Informatik, Band 1: Grundlagen und Überblick. Fachbuchverlag Leipzig, 2001. [9] T.H. Cormen, Ch.E. Leiserson, and R. L. Rivest. Introduction to Algorithms. MIT Press, Cambridge, Mass, 1994. Sehr gute Einführung in die Analyse von Algorithmen. 5.3, 5.5 [10] N. Wirth. Algorithmen und Datenstrukturen. Teubner-Verlag, Stuttgart, 1983 (3. Auflage). Ein Klassiker, vom Erfinder der Sprache PASCAL. [11] R. Sedgewick. Algorithmen. Addison-Wesley, Bonn, 1995. Übersetzung d. engl. Originals, empfehlenswert. [12] P. Tittmann. Graphentheorie. Fachbuchverlag Leipzig, 2003. Sehr gutes Buch mit vielen Beispielen. Leider fehlen die Wegesuchalgorithmen. [13] S. Krumke and H. Noltemeier. Graphentheoretische Konzepte und Algorithmen. Teubner Verlag, 2005. Exakt und gleichzeitig anschaulich. 86