Departement Mathematik und Informatik Algorithmen und Datenstrukturen, FS17 Prof Dr Christian Tschudin 22. Februar 2017 – Administratives – Einführung ins Thema – Einführung in Python R. Fisher Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 2 / 29 Willkommen zur Vorlesung . . . Algorithmen und Datenstrukturen FS17 I Dozent: Christian Tschudin I <[email protected]> Assistent: Christopher Scherb I (10906-01) <[email protected]> Tutoren: Ferdinand Badenberg <[email protected]> Clemens Büchner <[email protected]> Samuel Hugger <[email protected]> Simeon Jackman <[email protected]> Linard Schwendener <[email protected]> Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 3 / 29 Vorlesung und Uebungen I Vorlesung I I I Mi 14-16, Hörsaal KH 115 Do 14-16, Hörsaal KH 116 Uebungen I I I Di + Fr 14-16, Pharmazentrum U1075 Einteilung in zwei Gruppen Start: Dienstag 28.2.2017 Anmeldung unter https://courses.cs.unibas.ch/ Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 4 / 29 Lernziel Wie programmiere ich? Was ist “state of the art”? I von schlechten und guten Programmen . . . I Buchtitel von Niklaus Wirth (1976): Algorithms + Data Structures = Programs I Computer Science: – akkumuliertes Wissen (was gute A+DS sind) – Massstäbe (was gute A+DS sind) I Das ist Kanon! – weltweit Kern jeder Informatikausbildung Essenzielles Grundwissen für InformatikerInnen. Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 5 / 29 Zwei Zitate Linus Torvalds, Linux “I will, in fact, claim that the difference between a bad programmer and a good one is whether he considers his code or his data structures more important. Bad programmers worry about the code. Good programmers worry about data structures and their relationships.” Edsger Dijkstra, Turing Award 1972 “Object-oriented programming is an exceptionally bad idea which could only have originated in California.” Was ist Ihre Bewertung? Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 6 / 29 Computer Science. . . und Job-Suche A+DS berühmt-berüchtigt für Vorstellungsgespräche (Google, Microsoft etc) Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 7 / 29 Voraussetzungen I Vorlesung “Grundlagen der Programmierung” (1. Semester) I . . . oder anderweitige Programmiererfahrung, mit Vorteil in Java Algorithmen und Datenstrukturen, FS17 Lerninhalt I I I Algorithmen Datenstrukturen “en passant”: Python 22. Februar 2017 — 8 / 29 Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 9 / 29 Empfohlene Literatur I Textbuch Robert Sedgewick and Kevin Wayne: Algorithms 4th edition, Addison Wesley, 2011 I Ebenfalls oft eingesetzt (als Alternative/Ergänzung): Cormen, Leiserson, Rivest and Stein (CLRS): Introduction to Algorithms 3rd edition, MIT Press, 2009 Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 10 / 29 Ablauf (Entwurf 2017-02-16) 22.2. 23.2. 1.3. 2.3. 15.3. 16.3. 22.3. 23.3. 29.3. 30.3. 5.4. 6.4. 12.4. 13.4. L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 L11 L12 L13 – U1 U2 U3 U4 U5 U6 U7 Intro, Fisher-Yates, Python Recap ADT, bag/queue/stack Algo Analyse, recap Big-* Analytik vs Messung List, Trees, Iteratoren Rekursion, Iteration DS und Nebenläufigkeit Sortieren I Sortieren II Suchen I (Suchbäume) Suchen II (Hashing) Rand. vs determ. vs approx Disjoint sets (Ostern) 19.4. 20.4. 26.4. 27.4. 3.5. 4.5. 10.5. 11.5. 17.5. 18.5. 24.5. 25.5. 31.5. 1.6. L14 L15 L16 L17 L18 L19 L20 L21 L22 – L23 U8 U9 U10 U11 U12 Graphen I Graphen II Graphen III Optimierung Hackaton I Hackaton II dyn Prog Simplex Strings FSA, Kompression Reserve (Auffahrt) Ausblick (WORM, CRDT) Recap Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 11 / 29 Uebungsbetrieb Hauptsächlich in der Verantwortung der Tutoren und des Assistenten. I I I I Start: Di 28.2.2017 50% der max. Punkte als Auflage für die Klausur Mix von Abgeben (Hochladen), einzeln Vorzeigen und als Lösungsvortrag während der Uebungsstunde Ablauf Uebungsbetrieb: Mi: Ausgabe der Uebungsblätter Di + Fr: Vorbesprechen Mo Abend: Abgabe (Hochladen) Di + Fr: Nachbesprechung, Vorführen Erinnerung: https://courses.cs.unibas.ch/ Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 12 / 29 Schriftliche Klausur Auflage: Genügend Punkte (50%) in den Uebungen. I I Vorgesehenes Datum: Montag 12. Juni 2017, 15:15 – 17:00 Vorher Repetitorium: Donnerstag 1. Juni 2017 Nach erfolgreicher Leistungsüberprüfung: 8 ECTS Kreditpunkte Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 13 / 29 Uebersicht heutige Vorlesung I I I Ein Algorithmus aus dem Jahre 1938 (Fisher-Yates) Kurzeinführung Python Ein Algorithmus aus dem Jahre 1946 (Binary search) Man hätte weiter zurückgehen können (Euklid, Aristoteles. . . ) Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 14 / 29 Algorithmus von Fisher und Yates (1/6) Problemstellung Erzeuge eine zufällige Folge der Zahlen von 1 bis N (jede Zahl kommt darin nur einmal vor). I I I I Auch: Erzeuge eine zufällige Permutation. Lösung vorgestellt von R. Fisher und F. Yates 1938 In: Statistical tables for biological, agricultural and medical research, Oliver & Boyd, London Heutiger Name: “Fisher-Yates Shuffle” Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 15 / 29 Zufällige Permutation: 2 naive Ansätze Gegeben: random(i) (Zufallszahl zwischen 0 und i-1) a)“Sammle eine Zufallszahl nach der anderen” 1 2 3 4 5 6 7 8 9 def randPerm(n): P = zeroes(n) for pos = 0 to n-1: while True: z = 1 + random(n) if not z in P: break P[pos] = z return P I I I b)“Setze jede Zahl an eine zufällige Stelle” 1 2 3 4 5 6 7 8 9 def randPerm(n): P = zeroes(n) for z = 1 to n: while True: pos = random(n) if P[pos] == 0: break P[pos] = z return P Schleife wird n mal durchlaufen “Stochern”: Aufwand wächst pro Schleife, und mit n → (mind) quadratische Laufzeit O(n2 ) Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 16 / 29 Algorithmus von Fisher und Yates (3/6) Beschreibung von Fisher und Yates: 1. Write down the numbers from 1 through N. 2. Pick a random number k between one and the number of unstruck numbers remaining (inclusive). 3. Counting from the low end, strike out the kth number not yet struck out, and write it down at the end of a separate list. 4. Repeat from step 2 until all the numbers have been struck out. 5. The sequence of numbers written down in step 3 is now a random permutation of the original numbers. Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 17 / 29 Algorithmus von Fisher und Yates (4/6) Wandtafel und Diskussion I Zwei Listen: a) noch verfügbare Zahlen b) Ergebnis (the “separate list”) I Laufzeit potentiell auch O(n2 ) wegen Schritt 3: “strike out the kth number not yet struck out” I Trick von R. Durstenfeld (1964): – nur eine Liste – und Platztausch so dass alle noch verfügbaren Zahlen immer aufeinanderfolgend sind. Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 18 / 29 Algorithmus von Fisher und Yates (5/6) Fisher-Yates nach Durstenfeld Erzeugt eine zufällige Permutation in O(n). 1 2 3 4 5 6 7 def randPerm2(n): # permutiert in Feld mit n Elementen (Index läuft ab 0): P = [1...n] # Feld mit den Zahlen von 1 bis n for i = n-1 downto 1: j = random integer such that 0 <= j <= i exchange P[j] and P[i] n return P P 1 5 4 3 2 P 1 4 5 3 2 i j Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 19 / 29 Algorithmus von Fisher und Yates (6/6) Einsichten: I Algorithmus nicht an Existenz von Computern gebunden I Algorithmus kann ohne Programmiersprache ausgedrückt werden I Datenstruktur gehört dazu I “Gute” und “schlechte” Lösung – drastische Laufzeitunterschiede Wäre noch im Detail anzuschauen: I Wird jede mögliche Permutationen gleich zufällig ausgewählt? I Auch mit PNRG? (Pseudo Random Number Generator) Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 20 / 29 Ursprung von “Algorithmus” Das Wort Algorithmus geht zurück auf das Arabische und ist eine Abwandlung oder Verballhornung des Namens von Abu Dscha’far Muhammad ibn Musa al-Chwarizmi, dessen Namensbestandteil (Nisba) al-Chwarizmi der Choresmier“ bedeutet und auf die ” Herkunft des Trägers aus Choresmien verweist. Russische Briefmarke 1983 Als dessen Lehrbuch Über die indischen Ziffern (verfasst um 825 in Bagdad) im 12. Jahrhundert aus dem Arabischen ins Lateinische übersetzt und hierdurch in der westlichen Welt zur wichtigsten Quelle für die Ausbreitung der Kenntnis der indischen (heute meist als ’arabische’ bezeichneten) Ziffern und des schriftlichen Rechnens mit diesen Ziffern wurde, wurde auch der Name des Verfassers in Anlehnung an die Anfangsworte der ältesten Fassung dieser Übersetzung (Dixit Algorismi Algorismi hat gesagt“) in der ” Form Algorismus latinisiert und in der Folgezeit mit Varianten wie alchorismus, algoarismus und mit Entlehnungen in die Volkssprachen (altfranzösisch algorisme, argorisme, mittelenglisch augrim, augrym) zu einer allgemeinen Bezeichnung für die von al-Chwarizmi gelehrte Kunst des Rechnens mit solchen Ziffern, desgleichen zu einem gebräuchlichen Werktitel für mittelalterliche und frühneuzeitliche[4] Schriften über diese Kunst. Nach https://de.wikipedia.org/wiki/Algorithmus Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 21 / 29 Eine kurze Einführung in Python I I I I I I Algorithmen und Datenstrukturen, FS17 Guido van Rossum, 1994 (v1.0) Name in Anlehnung an Monty Python Script-Sprache, interpretiert Entstand im Umfeld von Amoeba (ein verteiltes Betriebssystem) Heute breiter Einsatz in Produktion (Cloud, Web-Dienste, Lehre+Forschung) v2.7 am häufigsten eingesetzt, v3.6 im Dez 2016 veröffentlicht 22. Februar 2017 — 22 / 29 “The Zen of Python” (Tim Peters, 2004) Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren’t special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you’re Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it’s a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let’s do more of those! Anspruch, kompakter+lesbarer+minimalistischer zu sein. Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 23 / 29 Warum Python? Produktivität Entwicklung mit Python ist 5-10 mal schneller als mit Java. Eigene Erfahrung (Entwicklung eines Dateisystems): I Prototyp in Python I Experimente mit verschiedenen Datenformaten und Algorithmen I Erst danach Wechsel zu C Python wird heute auf Gymnasiumstufe eingeführt. Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 24 / 29 Python Eigenheiten (1/4) Blockstruktur durch Einrücken (statt Klammern) Jeweils ein Statement pro Zeile (d.h. kein ’;’ notwendig). Beispiel: I I 1 2 3 4 5 I def factorial(n): if n == 0: return 1 else: return n * factorial(n-1) Dynamisch typisiert – Variablen haben eindeutigen Datentyp – Datentypen werden nur zur Laufzeit überprüft – Variablen können Datentyp wechseln (Java: statisch typisiert) Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 25 / 29 Python Eigenheiten (2/4) Sehr bequeme Manipulation von Feldern (list, array) und assoziativen Datenfeldern (dictionary/map/assoc array) I Listen: I 1 2 3 4 5 a = [1, 2, 3, 55, "abc"] print a[0] # erstes Element print a[1:3] # Unterliste [2, 3, 55] print a[1:] # Unterliste ab zweitem Element print a[:-1] # Unterliste ohne letztes Element Verzeichnisse: I 1 2 3 4 5 b = { ’raum’: ’HS 188’, print b[’raum’] for i in b: if type(b[i]) == str: print b[i] ’zeit’: ’14-16’, Algorithmen und Datenstrukturen, FS17 ’ects’: 8 } 22. Februar 2017 — 26 / 29 Python Eigenheiten (3/4) I Exzellente Unterstützung von Zeichenketten – single/double quotes: 'abc', "abc", 'say "A"' – Zeichenketten sind Listen: 'Xabc'[1:] – '.' * 32 ist eine Zeichenkette mit 32 Punkten – Formatierung wie von C (printf) bekannten – reguläre Ausdrücke als Standardbibliothek (re) I Object-Orientierung inklusive 1 2 3 4 5 6 class Grossartig(): def __init__(self, arg): self.arg = arg def getArg(self): return self.arg ... Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 27 / 29 Tuples, “List comprehension” (4/4) I Tuple als elegante Art, mehrere Werte zu bündeln – nützlich für return (nur 1 “Wert” erlaubt) – t = (1, 99), dann wie folgt lesen: a, b = t – eleganter 1-Zeilen-Swap: a, b = (b, a) I Listen “berechnen lassen” (statt von Hand einfüllen) sog. list comprehension = “Listen-Abstraktion” – quadrate = [ x*x for x in range(0,10) ] – oder z.B. kartesisches Produkt: 1 2 3 4 5 6 siz = [ ’klein’, ’mittel’, ’gross’ ] col = [ ’rot’, ’blau’, ’grün’ ] cartProd = [ (x, y) for x in siz for y in col ] print cartProd [ (’klein’, ’rot’), (’klein’, ’blau’), (’klein’, ’grün’), ... (’gross’, ’grün’) ] Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 28 / 29 Zufällige Permut. (Fisher-Yates) in Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/usr/bin/env python import random def randPerm(n): P = [ n for n in range(1, n+1) ] for i in range(n-2, 0, -1): j = random.randint(0, i) P[i], P[j] = (P[j], P[i]) return P if __name__ == "__main__": print randPerm(5) # eof Oder, weil “shuffle” schon eingebaut ist: 1 2 3 4 5 6 #!/usr/bin/env python import random P = range(1, 6) random.shuffle(P) print P Algorithmen und Datenstrukturen, FS17 22. Februar 2017 — 29 / 29 Idiome, und weiterführende Quellen I Python-Gemeinschaft kümmert sich sehr um die “beste Art”, wie eine Programmieraufgabe aufgeschrieben/gelöst werden kann (idom, pattern); “Pythonics” als Sprache I Empfehlung: Java (oder C oder Perl oder . . . ) nicht übersetzen, sondern Lösung neu denken. I Quellen: https://docs.python.org/2/tutorial/ https://docs.python.org/3/tutorial/ http://stackoverflow.com/documentation/python/topics