Algorithmen und Datenstrukturen, FS17 Willkommen zur Vorlesung . . .

Werbung
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
Herunterladen