Organisatorisches • VO (708.031) & UE (708.032) • Homepage: Datenstrukturen und Algorithmen http://www.igi.tugraz.at/lehre/D&A/WS09/index.html • Newsgroup: tu-graz.lv.datenalgo • Unterlagen: Folien, Hilfsblätter, Literatur • Vortragende: VO 708.031 – VO: DI Stefan Klampfl ([email protected]) – UE: Dr. Robert Legenstein ([email protected]) 08.10.2009 [email protected] 1 08.10.2009 Worum geht es? [email protected] Algorithmen • Ein Algorithmus (Methode, Verfahren, Rezept) nimmt bestimmte Daten als Input und transformiert diese nach festen Regeln in einen Output • Dabei greift der Algorithmus auf Daten zu, die in einer Datenstruktur organisiert sind • Datenstrukturen und Algorithmen können nicht getrennt voneinander betrachtet werden • Ein Algorithmus ist ein Verfahren zur Lösung eines Problems (im Unterschied zu seiner Implementation!) • Versuch einer Definition: 08.10.2009 08.10.2009 [email protected] 2 3 Ein Algorithmus ist eine endliche Folge von Anweisungen, die die Lösung eines bestimmten Problems erlaubt. Jede Anweisung hat eine klare Bedeutung und kann mit endlichem Aufwand und in endlicher Zeit ausgeführt werden. [email protected] 4 Algorithmen Datenstrukturen • Beispiele: Eine Datenstruktur ist eine bestimmte Art Daten zu verwalten und zu verknüpfen, damit man in geeigneter Art und Weise auf sie zugreifen und diese manipulieren kann. Sortieren Suchen Codieren Optimieren Algorithmen zur Manipulation von Datenstrukturen (z.B.: Einfügen, Entfernen, Maximum, etc.) – Kombinationen daraus (z.B.: zuerst Sortieren und dann Suchen) – – – – – Immer verbunden mit speziellen Operationen (z.B.: Einfügen, Entfernen, Sortieren, Maximum, Nachfolger,…) • Wichtige Eigenschaft: modular, können daher kombiniert werden 08.10.2009 [email protected] = wieder Algorithmen 5 08.10.2009 Datenstrukturen Wir wollen Algorithmen und Datenstrukturen systematisch analysieren und vergleichen. – Lineare Felder (arrays) – Stapel (stacks) – Schlangen (queues) – Halden (heaps) – Bäume (trees) – Hashtabellen – Kombinationen daraus (z.B.: Baum aus Halden, Schlange aus Bäumen, etc.) [email protected] 6 Worum geht es? • Beispiele: 08.10.2009 [email protected] Was ist ein guter Algorithmus? • Er muss korrekt sein, d.h. das richtige Ergebnis für alle möglichen Inputs liefern. • Er muss „schnell“ sein. • Er soll wenig Ressourcen (Zeit, Speicher, Bandbreite, CPUs, logische Gatter, …) benötigen. 7 08.10.2009 [email protected] 8 Analyse von Algorithmen Ein erstes Beispiel • Sortieren: Wir wollen wissen wie viel Zeit (allg.: Ressourcen) der Algorithmus in Abhängigkeit der Inputgröße benötigt. Input: eine Sequenz von n Zahlen a1 , a2 ,K, an Output: eine Permutation der Inputsequenz a1′, a2′ ,K, an′ sodass a1′ ≤ a′2 ≤ L ≤ an′ Abstraktion des Algorithmus (und der Datenstruktur) (Unabhängig von der eigentlichen Implementation – Sprache, OS, Protokolle, Hardware etc.) • Instanz des Sortierproblems: Input: 31,41,59,26,41,58 Output: 26,31,41,41,58,59 Mathematische Werkzeuge: Ein Algorithmus ist korrekt, wenn er für jede Instanz des Inputs einen korrekten Output liefert. O-Notation, Kombinatorik, Wahrscheinlichkeitstheorie, etc. 08.10.2009 [email protected] 9 08.10.2009 Ein erstes Beispiel [email protected] 10 Ein erstes Beispiel • Sortieren durch Einfügen (Insertion-Sort) • Sortieren durch Einfügen (Insertion-Sort) Pseudocode: Input: lineares Feld A[1..n] INSERTION-SORT(A) 1: FOR i=2 TO n 2: h=A[i] 3: j=i-1 4: WHILE A[j]>h AND j>0 DO 5: A[j+1]=A[j] 6: j=j-1 7: A[j+1]=h 08.10.2009 [email protected] 11 08.10.2009 [email protected] 12 Ein erstes Beispiel Analyse der Laufzeit • Uns interessiert die Laufzeit in Abhängigkeit der Größe des Inputs • Inputgröße: hängt vom Problem ab (z.B.: Länge des Arrays, Anzahl der Inputbits) • Laufzeit: Zählen der elementaren Schritte: • Warum ist Insertion-Sort korrekt? INSERTION-SORT(A) 1: FOR i=2 TO n 2: h=A[i] 3: j=i-1 4: WHILE A[j]>h AND j>0 DO 5: A[j+1]=A[j] 6: j=j-1 7: A[j+1]=h – – – – – • Nach jedem Durchlauf der FOR-Schleife sind die ersten i Zahlen sortiert (Schleifeninvariante) • Korrektheitsbeweis durch Induktion 08.10.2009 • Alle Schritte brauchen dabei bestimmte, aber konstante Zeiten [email protected] 13 08.10.2009 Laufzeit von Insertion-Sort Pseudocode Zeit-Kosten INSERTION-SORT (A) 1: FOR i=2 TO n 2: h=A[i] 3: j=i-1 4: WHILE A[j]>h AND j>0 DO 5: A[j+1]=A[j] 6: j=j-1 7: A[j+1]=h 08.10.2009 [email protected] [email protected] 14 Laufzeit von Insertion-Sort Anzahl c1 n c2 n-1 c3 c4 c5 c6 n-1 ∑ c7 Zuweisung: a=b, c=3.0 Arithmetische Operationen: +, -, *, / Einfache Funktionen: sqrt(x), ln(x), swap(x,y) Vergleiche: ==, <, >, ≤, ≥ Indirekte Adressierung: A[i], B[k+1] • Laufzeit hängt von der Vorsortierung des Arrays ab (ti … Anzahl der WHILE-Abfragen für das i-te Element) • Fallunterscheidungen: n i= 2 i ∑ n i=2 t (ti − 1) n ∑ (t n-1 i =2 i − 1) 15 – Best case: Array bereits sortiert T(n) ist eine lineare Funktion von n – Worst case: Array umgekehrt sortiert T(n) ist eine quadratische Funktion von n – Average case: T(n) ist quadratische Funktion von n • Wir sind vor allem an der Ordnung interessiert, mit der die Laufzeit in Abhängigkeit der Inputgröße wächst 08.10.2009 [email protected] 16 Fallunterscheidungen Vergleich zweier Ordnungen • Gründe für worst-case Analyse: – – – – Entspricht der oberen Schranke – keine Überraschungen Kommt häufig vor (z.B.: Suchen nach nicht gespeicherten Daten) Mittlerer Fall oft ordnungsmäßig nicht besser Oft sehr einfach am Pseudocode ablesbar • Sortieren von 300.000 Einträgen (z.B. Grazer Telefonbuch): – Alter PC (1 MIPS): Insertion-Sort: T(n) ≈ n2 90 Milliarden Schritte 90.000 sec ≈ 25 h > 1 Tag • Gründe für best-case Analyse: – Entspricht der unteren Schranke – Sinnvoll, wenn der beste Fall wahrscheinlicher ist – Supercomputer (500 Mflops): • Gründe für average-case Analyse: – – – – Um eine durchschnittliche Performance zu analysieren Wenn der worst case sehr selten ist Zusätzlich Wissen über die Verteilung der Inputs nötig Meist komplizierter in der Analyse 08.10.2009 [email protected] Besserer Sortieralgorithmus: T(n) ≈ n*ld(n) ≈ 5,5 Millionen Schritte 5,5 sec!!! Insertion-Sort: T(n) ≈ n2 90 Milliarden Schritte 180 sec = 3 min 17 08.10.2009 [email protected] 18 Vergleich zweier Ordnungen • Sortieren von 8.000.000 Einträgen (z.B. NYC Telefonbuch): – Alter PC (1 MIPS): Insertion-Sort: T(n) ≈ n2 6.4*1013 Schritte 416.67 Tage Besserer Sortieralgorithmus: T(n) ≈ n*ld(n) ≈ 183 Millionen Schritte 183 sec!!! Danke für Ihre Aufmerksamkeit! Bis zum nächsten Mal. (Donnerstag, 15. Okt. 2009, 11:15, i13) – Supercomputer (500 Mflops): Insertion-Sort: T(n) ≈ n2 6.4*1013 Schritte 35 Stunden 08.10.2009 [email protected] 19 08.10.2009 [email protected] 20