Datenstrukturen und Algorithmen Kurs
Datenstrukturen und Algorithmen Kurs
und Algorithmen
Introduction
Jens Krüger
Lecture
Prof. Dr. Jens Krüger
Exercises
Mohamed Abdelmagied and Torben Karl
Winter Summer
Grundlegende Programmiertechniken Grundlegende Programmiertechniken
Scienti c Visualization
7
Take Notes!
Slides are not a script!
7
[Link]
8
[…] Fried found a signi cant, negative relationship
between in-class laptop use and course grade.
Follow-up correlational analysis also revealed that
higher levels of laptop use were associated with
lower student-reported levels of attention, lecture
clarity, and understanding of the course material.
10
11
Study in teams!
11
12
Exercise
12
Exercises
Starting: April 11th
Introduction
Jens Krüger
16
17
17
Topics
topic data structures and algorithms
18
fi
fi
fl
Why participate in this class?
19
Why participate in this class?
r s e
c o u
t h e r ! “
e e d e l o
u n a c h
” Yo u B
r y o
f o
19
• Internet. Web search, packet routing, distributed le sharing, …
20
fi
fi
”handicraft work“
21
Motivation
23
Software Errors
23
1962: Mariner 1
Cost: $18.5 million
Disaster:
Mariner 1 rocket diverted from ight path
Mission Control destroyed it after 293 seconds
Cause:
A programmer incorrectly transcribed a
handwritten formula into computer code,
missing a single superscript bar.
24
fl
1996: Ariane 5
Cost: $500 million
Disaster:
Self destruct after 39 seconds
Cause:
Guidance computer tried to convert the sideways rocket
velocity from 64-bits to a 16-bit format An over ow error
resulted. The guidance system shut down, control passed
to an identical redundant unit, which also failed because
it was running the same algorithm. Code „worked“ on the
slower Ariane 4 rocket and (Guidance data was not even
needed/used, only used to align system before launch)
25
fl
1982: CIA plants a software
bug in Soviet Pipeline
Cost: Millions of dollars, signi cant
damage to Soviet economy
Disaster:
„The largest man-made non-nuclear
explosion in history“
Cause:
Soviets buy Canadian software to control
gas pipelines CIA discovered the purchase
and sabotaged the software so that it
would pass Soviet inspection but fail in
operation.
26
fi
1985: Therac-25
Cost: Three people dead, three
people critically injured
Disaster:
Therac-25 delivers lethal dose of
radiation to patients
Cause:
multiple design bugs lead to a
number of different accidents
(missing hardware locks, race
conditions, over ows, ...)
27
fl
2015: Dreamliner
Cost: Millions of dollars ?
Cause:
[..] a Model 787 airplane that has been powered
continuously for 248 days can lose all alternating current
(AC) electrical power due to the generator control units
(GCUs) simultaneously going into failsafe mode.
231
= 248,55134815 days
100 ⋅ 60 ⋅ 60 ⋅ 24
28
fl
29
GPT Lecture Videos
30
Object Oriented Programming (OOP)
in Python
Dates in Python
import random
day = [Link](1,28)
month = [Link](1,12)
year = [Link](1900,2100)
32
Dates in Python
import random
day = []
month = []
year = []
for i in range(100):
day += [[Link](1,28)]
month += [[Link](1,12)]
year += [[Link](1900,2100)]
for i in range(len(day)):
print(day[i],".", month[i], ".", year[i],sep="")
33
Dates in Python
import random
class Date:
def __init__(self, day, month, year):
[Link] = day
[Link]= month
[Link] = year
dates = []
for i in range(100):
d = [Link](1,28)
m = [Link](1,12)
y = [Link](1900,2100)
dates += [Date(d,m,y)]
34
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
35
Eine Datum Klasse
Schlüsselwort class
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
35
Eine Datum Klasse
Schlüsselwort class
import random Bezeichner der neuen Klasse
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
35
Eine Datum Klasse
import random __init__-Methode
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
36
Eine Datum Klasse
import random __init__-Methode
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)__init__-Methode
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
37
Eine Datum Klasse
import random self-Parameter
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
38
Eine Datum Klasse
import random self-Parameter
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = [] self-Parameter
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
38
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
39
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
39
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
40
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
def tagImJahr(self):
monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
if ([Link] > 2): monatsTage+= 28
if ([Link] > 3): monatsTage+= 31
if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
daten = []
for i in range(100):
daten += [Datum([Link](1,28), [Link](1,12),
[Link](1900,2100))]
41
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
def tageImFeb(self):
if [Link] % 4 == 0 and ([Link] % 100 != 0 or [Link] % 400 == 0):
return 29
else:
return 28
def tagImJahr(self):
monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
if ([Link] > 2): monatsTage+= [Link]()
if ([Link] > 3): monatsTage+= 31
if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
daten = []
for i in range(100):
daten += [Datum([Link](1,28), [Link](1,12),
[Link](1900,2100))]
42
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
def __tageImFeb(self):
if [Link] % 4 == 0 and ([Link] % 100 != 0 or [Link] % 400 == 0):
return 29
else:
return 28
def tagImJahr(self):
monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
if ([Link] > 2): monatsTage+= self.__tageImFeb()
if ([Link] > 3): monatsTage+= 31
if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
daten = []
for i in range(100):
daten += [Datum([Link](1,28), [Link](1,12),
[Link](1900,2100))]
43
[Link]
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
[Link] def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
import random
import Datum
def __tageImFeb(self):
daten = [] if [Link] % 4 == 0 and ([Link] % 100 != 0 or [Link] % 400 == 0):
return 29
for i in range(100): else:
t = [Link](1,28) return 28
m = [Link](1,12)
j = [Link](1900,2100) def tagImJahr(self):
daten += [[Link](t,m,j)] monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
for datum in daten: if ([Link] > 2): monatsTage+= self.__tageImFeb()
print(datum) if ([Link] > 3): monatsTage+= 31
print([Link]()) if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
44
[Link]
import random
class Datum:
def __init__(self, tag, monat, jahr):
self.__tag = tag
self.__monat= monat
self.__jahr = jahr
def tag(self):
return self.__tag
def monat(self):
return self.__monat
def jahr(self):
return self.__jahr
def __repr__(self):
return str(self.__tag) + "." + str(self.__monat) + "." + str(self.__jahr)
def __hash__(self):
return hash((self.__tag, self.__monat, self.__jahr))
@staticmethod
def __maxTageImMonat(monat,jahr):
if monat == 1: return 31
elif monat == 2:
if jahr % 4 == 0 and (jahr % 100 != 0 or jahr % 400 == 0):
return 29
else:
return 28
elif monat == 3: return 31
elif monat == 4: return 30
elif monat == 5: return 31
elif monat == 6: return 30
elif monat == 7: return 31
elif monat == 8: return 31
elif monat == 9: return 30
elif monat == 10: return 31
elif monat == 11: return 30
else: return 31
def tagImJahr(self):
monatsTage = 0;
for m in range(1,self.__monat):
monatsTage += self.__maxTageImMonat(m,self.__jahr)
return self.__tag + monatsTage
45
Dates in Python
import random
class Date:
def __init__(self, day, month, year):
[Link] = day
[Link]= month
[Link] = year
def output(self):
print([Link],".",[Link],".",[Link],sep="")
dates = []
for i in range(100):
d = [Link](1,28)
m = [Link](1,12)
y = [Link](1900,2100)
dates += [Date(d,m,y)]
46
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
47
Eine Datum Klasse
Schlüsselwort class
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
47
Eine Datum Klasse
Schlüsselwort class
import random Bezeichner der neuen Klasse
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
47
Eine Datum Klasse
import random __init__-Methode
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
48
Eine Datum Klasse
import random __init__-Methode
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)__init__-Methode
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
49
Eine Datum Klasse
import random self-Parameter
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
50
Eine Datum Klasse
import random self-Parameter
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = [] self-Parameter
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
50
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
51
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
51
Eine Datum Klasse
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
daten = []
for i in range(100):
t = [Link](1,28)
m = [Link](1,12)
j = [Link](1900,2100)
daten += [Datum(t,m,j)]
52
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
def tagImJahr(self):
monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
if ([Link] > 2): monatsTage+= 28
if ([Link] > 3): monatsTage+= 31
if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
daten = []
for i in range(100):
daten += [Datum([Link](1,28), [Link](1,12),
[Link](1900,2100))]
53
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
def tageImFeb(self):
if [Link] % 4 == 0 and ([Link] % 100 != 0 or [Link] % 400 == 0):
return 29
else:
return 28
def tagImJahr(self):
monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
if ([Link] > 2): monatsTage+= [Link]()
if ([Link] > 3): monatsTage+= 31
if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
daten = []
for i in range(100):
daten += [Datum([Link](1,28), [Link](1,12),
[Link](1900,2100))]
54
import random
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
def __tageImFeb(self):
if [Link] % 4 == 0 and ([Link] % 100 != 0 or [Link] % 400 == 0):
return 29
else:
return 28
def tagImJahr(self):
monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
if ([Link] > 2): monatsTage+= self.__tageImFeb()
if ([Link] > 3): monatsTage+= 31
if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
daten = []
for i in range(100):
daten += [Datum([Link](1,28), [Link](1,12),
[Link](1900,2100))]
55
[Link]
class Datum:
def __init__(self, tag, monat, jahr):
[Link] = tag
[Link]= monat
[Link] = jahr
[Link] def __repr__(self):
return str([Link]) + "." + str([Link]) + "." + str([Link])
import random
import Datum
def __tageImFeb(self):
daten = [] if [Link] % 4 == 0 and ([Link] % 100 != 0 or [Link] % 400 == 0):
return 29
for i in range(100): else:
t = [Link](1,28) return 28
m = [Link](1,12)
j = [Link](1900,2100) def tagImJahr(self):
daten += [[Link](t,m,j)] monatsTage = 0;
if ([Link] > 1): monatsTage+= 31
for datum in daten: if ([Link] > 2): monatsTage+= self.__tageImFeb()
print(datum) if ([Link] > 3): monatsTage+= 31
print([Link]()) if ([Link] > 4): monatsTage+= 30
if ([Link] > 5): monatsTage+= 31
if ([Link] > 6): monatsTage+= 30
if ([Link] > 7): monatsTage+= 31
if ([Link] > 8): monatsTage+= 31
if ([Link] > 9): monatsTage+= 30
if ([Link] > 10): monatsTage+= 31
if ([Link] > 11): monatsTage+= 30
return [Link] + monatsTage
56
[Link]
import random
class Datum:
def __init__(self, tag, monat, jahr):
self.__tag = tag
self.__monat= monat
self.__jahr = jahr
def tag(self):
return self.__tag
def monat(self):
return self.__monat
def jahr(self):
return self.__jahr
def __repr__(self):
return str(self.__tag) + "." + str(self.__monat) + "." + str(self.__jahr)
def __hash__(self):
return hash((self.__tag, self.__monat, self.__jahr))
@staticmethod
def __maxTageImMonat(monat,jahr):
if monat == 1: return 31
elif monat == 2:
if jahr % 4 == 0 and (jahr % 100 != 0 or jahr % 400 == 0):
return 29
else:
return 28
elif monat == 3: return 31
elif monat == 4: return 30
elif monat == 5: return 31
elif monat == 6: return 30
elif monat == 7: return 31
elif monat == 8: return 31
elif monat == 9: return 30
elif monat == 10: return 31
elif monat == 11: return 30
else: return 31
def tagImJahr(self):
monatsTage = 0;
for m in range(1,self.__monat):
monatsTage += self.__maxTageImMonat(m,self.__jahr)
return self.__tag + monatsTage
57
R EADING L IST :
h tt p : / / a l g s 4 . c s . p r i n c e t o n . e d u
58