Algorithmen und Datenstrukturen (für ET/IT

Werbung
Algorithmen und Datenstrukturen (für ET/IT)
Wintersemester 2012/13
Dr. Tobias Lasser
Computer Aided Medical Procedures
Technische Universität München
Organisatorisches
• Probe-Klausur: Montag, 4. Februar 2013
• nicht bewertet!
• 6. Februar: Vorlesung Kapitel 11 Datenkompression
• 7. Februar: Vorlesung Kapitel 12 Kryptographie
• 8. Februar: letzte Tutorfragestunde
• 21. Februar: Klausur
2
Probeklausur
• Wann? während Zentralübung am Montag, 4. Februar 2013
• Wo? Hörsaal 1200
• Wie?
• 9:45 - 10:30: Bearbeitungszeit Probeklausur
• 10:30 - 11:15: Besprechung der Probeklausur
• Erlaubtes Material:
• nur 1 DIN A4 Blatt, handbeschrieben
• keine Bücher, Skripten, Ausdrucke, Smartphones, etc.
• Wozu?
• Simulation der tatsächlichen Prüfungssituation am 21. Februar
2013
• Vertrautmachen mit der Art von Prüfungsaufgaben
3
Übersicht Inhalte
1
Einführung
2
Mathematische Grundlagen
3
Elementare Datenstrukturen
4
Grundlagen der Korrektheit von Algorithmen
5
Grundlagen der Effizienz von Algorithmen
6
Grundlagen des Algorithmen-Entwurfs
7
Fortgeschrittene Datenstrukturen
8
Such-Algorithmen
9
Graph-Algorithmen
10
Numerische Algorithmen
4
Übersicht Inhalte
Nicht Klausur-relevant:
11
Datenkompression
12
Kryptographie
5
Kapitel 1: Einführung
• Was ist ein Algorithmus?
• Was ist eine Datenstruktur?
• Wo kommen sie vor?
• Beschreibung von Algorithmen und Churchsche These
• 4 Bausteine von Algorithmen
6
Kapitel 2: Mathematische Grundlagen
2.1 Mengen
• Definition, Teilmengen, Kardinalität, Operationen
• Potenzmenge, Kartesisches Produkt
2.2 Abbildungen
• Definition und Eigenschaften, Folgen, Polynome
2.3 Zahldarstellung
• Dezimal-, Binär-, Hexadezimalsystem
• Primitive Datentypen, 2-Komplement Darstellung
• Fixed point und Floating point Darstellung
2.4 Boolesche Logik
• Logische Werte, Verknüpfungen, Wahrheitstabellen
• Kombination von Verknüpfungen, Rangfolge und Rechenregeln
7
Kapitel 3: Elementare Datenstrukturen
3.1 Zeichenfolgen
• ASCII Code, Unicode, Zeichen und Strings
3.2 Felder
• Feld als sequentielle Liste mit Operationen
• Feld als (doppelt) verkettete Liste mit Operationen
3.3 Stack
• Abstrakte Datentypen, abstrakte Variable
• Stack mit Operationen und Implementationen
(sequentielle / verkettete Liste)
3.4 Queue
• Queue mit Operationen und Implementationen
(verkettete Liste, (zirkuläre) sequentielle Liste)
8
Kapitel 4: Grundlagen der Korrektheit von Algorithmen
4.1 Motivation und Spezifikation
• Relative Korrektheit, Nachweis durch Verifikation, Validation
4.2 Verifikation
• Vor- und Nachbedingungen, partielle und totale Korrektheit
• Korrektheitsbeweis für 4 Bausteine
4.3 Beispiel: Insertion Sort
• Algorithmus und Verifikation
4.4 Validation
• Systematische Tests: Blackbox-, Whitebox-, Regression-,
Integrations-Test
• Fehlerquellen, fehlertolerantes und fehlerpräventives
Programmieren
9
Kapitel 5: Grundlagen der Effizienz von Algorithmen
5.1 Motivation
• Komplexität Insertion Sort, Wachstumsraten
5.2 RAM-Modell
• Rechnermodell zur Laufzeitanalyse
5.3 Landau-Symbole
• Landau-Symbole O und Θ, Konstanten und Rechenregeln
• Kategorisierung der Effizienz von Algorithmen
• Komplexität der 4 Bausteine
10
Kapitel 6: Grundlagen des Algorithmen-Entwurfs
6.1 Entwurfsprinzipien
• Prinzip Verfeinerung, Prinzip Algorithmen-Muster
6.2 Divide and Conquer
• Muster Divide and Conquer, MergeSort, QuickSort
• Ausblick auf später: Binäre Suche, Strassen, FFT
6.3 Greedy-Algorithmen
• Muster Greedy, Wechselgeld, minimaler Spannbaum
• Ausblick auf später: Dijkstra, Prim
(Huffman Code - nicht Klausur-relevant)
6.4 Backtracking
• Muster Backtracking, Labyrinth, Traveling Salesman,
Acht-Damen-Problem
6.5 Dynamisches Programmieren
• Muster dynamisches Programmieren, Fibonacci-Zahlen
11
Ende Teil 1
Ende Teil 1, nun Teil 2
12
Kapitel 7: Fortgeschrittene Datenstrukturen
7.1 Graphen
7.2 Bäume
7.3 Heaps
7.4 Priority Queues
13
Kapitel 7.1: Graphen
Definition: Ungerichteter Graph
• Ungerichteter Graph:
Definition: Ungerichteter Graph
Ein ungerichteter Graph ist ein Paar G = (V , E ) mit
• V endliche Menge der Knoten
• E ✓ {u, v } : u, v 2 V
Menge der Kanten
Definition: Gerichteter Graph
• Gerichteter Graph:
•
auf Englisch:
Beispiel:
Definition:
Gerichteter
• Knoten
= vertices Graph
4
• Kanten = edges
Ein gerichteter Graph ist ein Paar G = (V , E ) mit
• es ist {u, v } = {v , u}, d.h. Richtung der
• V endliche Menge der Knoten
Kante spielt keine Rolle
• E ✓ V ⇥ V Menge der Kanten
2
3
1
5
Definition: Gewichteter Graph
• Gewichteter Graph:
• E ✓ (u, v ) : u, v 2 V
=V ⇥V
Beispiel:
Graph
•Definition:
es ist (u, vGewichteter
) 6= (v , u), d.h.
Richtung der
4
spielt eine
Rolle
EinKante
gewichteter
Graph
ist ein Graph G = (V , E ) mit einer
w :möglich,
E ! R. d.h. Kanten der
2
•Gewichtsfunktion
hier sind Schleifen
Form (u, u) für u 2 V
Beispiel:
• der Graph G kann gerichtet oder ungerichtet
1
5
3
5
14
Kapitel 7.1: Graphen
• Eigenschaften von Graphen:
• adjazente Knoten
• gerichteter Graph: Eingangs- und Ausgangsgrad
• ungerichteter Graph: Grad
• Pfad zwischen Knoten
• Zyklus in gerichteten und ungerichteten Graphen
• (starker) Zusammenhang und (starke)
Zusammenhangskomponenten
• Darstellung von Graphen:
• Adjazenzmatrizen, Speicherkomplexität: O(|V |2 )
• Adjazenzlisten, Speicherkomplexität: O(|V | + |E |)
• Komplexitäten der Operationen
• Kanten-Operationen einfach mit Adjazenzmatrix: O(1)
• Knoten einfügen einfach mit Adjazenzliste: O(1)
• Knoten löschen immer aufwendig: O(|V |2 ) bzw. O(|V | + |E |)
15
Kapitel 7.2: Bäume
Definition
Wald/Baum
• Bäume
und Wälder:
Definition: Wald und Baum
• Ein azyklischer ungerichteter Graph heißt auch Wald.
• Ein zusammenhängender, azyklischer ungerichteter Graph
heißt auch Baum.
• falls Kante entfernt: nicht mehr zusammenhängend
• falls Kante hinzugefügt: nicht mehr azyklisch
• |E | = |V | − 1
• Eigenschaften:
• Wurzelknoten, Vaterknoten, innere Knoten, Blätter
Wurzel
w
Vater
innerer Knoten
28
x
Kind
v
Blätter
16
Kapitel 7.2: Bäume
• Eigenschaften:
• Tiefe, Ebene, Höhe
w
Ebene 0
Ebene 1
Höhe = 3
Ebene 2
Ebene 3
• Spezialfälle:
• geordnete Bäume (→ Suchbäume)
• n-äre Bäume
• Binärbäume
• Darstellung von Bäumen:
• mit (doppelt) verketteten Listen
• Binärbäume mit (doppelt) verketteten Listen (Kind
links/rechts) bzw. als sequentielle Liste
17
Kapitel 7.2: Bäume
• Traversierung von Binärbäumen:
• Tiefensuche/DFS: Pre-order (wlr), In-order (lwr), Post-order
(lrw)
Implementierung z.B. mit Stack
• Breitensuche/BFS
Implementierung z.B. mit Queue
18
Kapitel 7.3: Heaps
Definition Heap
• Heap:
Definition Heap
Sei G = (V , E ) ein Binärbaum mit Wurzel w 2 V . Jeder Knoten
v 2 V sei mit einem Wert key (v ) verknüpft, die Werte seien durch
, geordnet.
G heißt Heap, falls er folgende zwei Eigenschaften erfüllt:
• G ist fast vollständig, d.h. alle Ebenen sind vollständig gefüllt,
ausser auf der untersten Ebene, die von links her nur bis zu
einem bestimmten Punkt gefüllt sein muss.
• G erfüllt die Min-Heap-Eigenschaft bzw. die
Max-Heap-Eigenschaft, d.h. für alle Knoten v 2 V , v 6= w gilt
• Min-Heap: key (v .vater )  key (v )
• Max-Heap: key (v .vater )
key (v )
Entsprechend der Heap-Eigenschaft heißt G Min-Heap bzw.
Max-Heap.
20
19
Kapitel 7.3: Heaps
• Operationen:
• minHeapify: O(log n)
• buildMinHeap: O(n)
• extractMin: O(log n)
1
11
3
5
2
9
8
3
11
5
2
9
extractMin
minHeapify
2
2
3
5
11
9
8
8
minHeapify
3
5
8
9
11
minHeapify
• HeapSort:
• buildMinHeap und extractMin bis leer
• in-place, O(n log n), besser als QuickSort im worst case
20
Kapitel 7.4: Priority Queues
• Priority
Queue:
Definition
Priority Queue
Definition Priority Queue
Eine Priority Queue ist ein abstrakter Datentyp. Sie beschreibt
einen Queue-artigen Datentyp für eine Menge von Elementen mit
zugeordnetem Schlüssel und unterstützt die Operationen
• Einfügen von Elemente mit Schlüssel in die Queue,
• Entfernen von Element mit minimalem Schlüssel aus der
Queue,
• Ansehen des Elementes mit minimalem Schlüssel in der Queue.
• Operationen auf
Priority1 Queue
0
2
7 als 3Heap:
• extractMin und insert, beides O(log n)
• decreaseKey: O(log n)
5
• entsprechend gibt es auch eine Priority Queue mit
• auch implementierbar
mitvon(un)sortierten
Feldern
Entfernen/Ansehen
Elememt mit maximalem
Schlüssel
11
21
Kapitel 8: Such-Algorithmen
8.1 Lineare Suche
8.2 Binäre Suche
8.3 Binäre Suchbäume
8.4 Balancierte Suchbäume
8.5 Suchen in Zeichenketten
22
Kapitel 8.1 und 8.2: Lineare und binäre Suche
• Lineare Suche: durchlaufe Array bis gesuchter Schlüssel
gefunden: O(n)
• Binäre Suche: sortiere Array, dann Divide and Conquer:
O(log n)
1
2
3
4
5
6
7
8
9
10
1
3
4
6
8
12
14
15
17
20
low
1
middle
3
4
6
8
high
12
14
low
1
3
4
6
8
15
17
middle
12
14
low
high
15
20
high
17
20
23
Kapitel 8.3: Binäre Suchbäume
Binärer Suchbaum
• Binärer Suchbaum:
Definition binärer Suchbaum
Sei G = (V , E ) ein Binärbaum mit Wurzel w 2 V . Jeder Knoten
v 2 V sei mit einem Wert key (v ) verknüpft, die Werte seien durch
, geordnet.
G heißt binärer Suchbaum, falls für alle inneren Knoten v 2 V gilt
• für alle Knoten x im linken Teilbaum v .left gilt
key (x)  key (v )
• für alle Knoten y im rechten Teilbaum v .right gilt
key (y )
key (v )
5
32
2
1
8
3
9
24
Kapitel 8.3: Binäre Suchbäume
• Operationen auf binären Suchbäumen mit Höhe h:
• Suchen, Minimum, Maximum: O(h)
• Einfügen, Löschen: O(h)
• Effizienz direkt abhängig von Höhe
• best case: O(log n)
• worst case: O(n)
1
2
5
3
2
1
5
8
3
7
9
7
8
ausgeglichen
entartet
9
• Ausweg: balancierte Suchbäume
25
Kapitel 8.4: Balancierte Suchbäume
• Problem: binären Suchbaum balanciert zu halten ist
aufwendig: O(n)
• Ausweg: Abschwächung der Kriterien
•Definition
balanciert:AVL-Baum
AVL-Bäume
• Binärbaum: B-Bäume, Rot-Schwarz-Bäume
• AVL-Bäume:
Definition AVL-Baum
Ein binärer Suchbaum G = (V , E ) mit Wurzel w 2 V heißt
AVL-Baum, falls er die AVL-Bedingung erfüllt:
• für jeden inneren Knoten v 2 V gilt: Höhe von linkem und
rechtem Teilbaum von v unterscheidet sich maximal um 1.
• benannt
nachEinfügen,
G.M. Adelson-Velskii
Landis und
• Anpassung
von
Löschen und
mitE.M.
Rotation
(russische Mathematiker)
Doppelrotation
• AVL-Bedingung nur für Wurzel w ist nicht ausreichend
• beide Teilbäume der Wurzel können entartet sein
26
Kapitel 8.5: Suchen in Zeichenketten
• Problem: suche Muster (Länge m) in Text (Länge n)
• Brute-Force Algorithmus: teste an jeder Textstelle O(nm)
• Knuth-Morris-Pratt Algorithmus:
O(n + m)
Suche
• Präfix-Tabelle: Zahl der vorangehenden Zeichen, die Präfix von
Muster bilden
Annahme: Wir scheitern beim Vergleichen des Wortes mit dem
Annahme: Wir
beim Vergleichen
des Wortes mit dem
• scheitern
modifizierter
Brute-Force-Algorithmus:
Satz...
Suche
Satz...
I ...an einer Stelle, wo die Präfixtabelle 0 ist:
inPräfixtabelle
Präfix-Tabelle:
ohne zurückspringen
I ...an einer Stelle,•wo0die
nicht 0 ist: direkt weitersuchen
I Es gab kein Präfix, also müssen wir nicht zurück (wie bei
I
Wir wissen von
Präfix,
mitten im Wort fort,
Brute-Force)
und können
direkt weitermachen, also hier i = 4,
• dem
nicht
0 und
in fahren
Präfix-Tabelle:
mitten
in Muster
weitersuchen
hier i = 2, j = 2 und dann Test ob w [j] = s[i + j]...
j = 0 und dann Test ob w [j] = s[i + j]...
0
1
2
3
4
5
6
7
8
9
a
a
b
b
a
a
a
b
b
b
a
c
a
b
c
b
a
b
b
c
...
0
1
2
3
4
5
6
7
8
9
a
a
b
b
c
c
b
b
a
c
a
b
c
b
c
b
b
c
b
c
...
12
12/26
27
Kapitel 9: Graph-Algorithmen
9.1 Tiefensuche
9.2 Breitensuche
9.3 Kürzeste Pfade
9.4 Minimale Spannbäume
28
F
B
B
F
Kapitel
9.1: Tiefensuche4/5
4/5
3/6
x
y
z
3/6
x
v
1/8
F
z
u
1/8
B
v
1/8
F
3/6
x
4/5
u
9/_
C
B
4/5
F
w
2/7
y
u
9/_
F
3/6
y
z
x
y
z
v
w
u
v
w
10/
_
z
v
1/8
C
4/5
3/6
x
w
2/7
B
B
4/5
y
• Tiefensuche / DFS: O(|V | + |E |)
u
x
F
C
B
4/5
x
w
2/7
3/6
y
z
9/
• 2/7
9/_
1/8 oder 2/7
Implementation
rekursiv
mit Stack
12
C
C
• Anwendungen:
B
F
• berechnet Spannwald von Graph, markiert Rückkanten,
10/
10/
3/6
4/5 Cross-Kanten
3/6
Vorwärtskanten
und
11
11
y
z
x
• Test aus BZusammenhang
y
z
B
• Test auf Zyklenfreiheit
• Segmentierung von binären Bildern mit Nachbarschafts-Graph
29
Kapitel 9.2: Breitensuche
r
s
∞
t
0
u
∞
r
∞
Q:
∞
∞
∞
• Breitensuche / BFS:v O(|Vw | + |Ex|)
r
s
1
t
0
∞
∞
v
u
1
2
1
w
r
s
1
∞
Q:
∞
0
s
y
2
s
1
r
t
0
x
2
∞
1
v
w
x
y
v
w
r
s
t
u
r
s
1
0
2
3
1
• Implementation mit Queue
Q: x v u
• Anwendungen:
2
1
2
∞
2
• Besuch von Knoten
in Zusammenhangskomponente
v
w
x
y
v
• Berechnung Länge der kürzesten Pfade (d.h. Anzahl von
Kanten)
• Segmentierung von binären Bildern mit Nachbarschafts-Graph
0
1
w
30
w (p) =
Kapitel 9.3: Kürzeste Pfade
k 1
X
w (vi , vi+1 )
i=1
• das Pfad
Gewichtindes
kürzesten PfadesGraph:
zwischenPfad
zwei Knoten
u
• Kürzester
gewichtetem
mit minimaler
(u, v 2 V ) ist
Summeund
derv Gewichte
l: Ablauf Dijkstra-Algorithmus
1
(
u
1
∞
v
wmin (u, v ) =
∞
10
10
2 3
0
5 6
s
2 3
5 6
0
• Dijkstra Algoritmus: Greedy-Algorithmus,
O(|E | log |V |)
7
7
5
• Voraussetzung: Kanten haben positives Gewicht
5
∞
∞
2
5
32
∞
2
y
x
y aus Menge aktueller
• erweitere
Pfad um kürzeste Kante
heraus
x
(s,0)
min{w (p) : p Pfad von u nach v } Pfad existiert
u
v
1
1
sonst
10
∞
Knoten
(u, ∞) (v, ∞) (x, ∞) (y, ∞)
Q:
(x, 5) (u, 10) (v, ∞)
(y, ∞)
• entscheidendes Hilfsmittel: Priority Queue
u
1
8
v
u
∞
10
5 6
s
5
x
(u, 8)
(v, ∞)
2 3
0
7
5
(y, 7)
v
13
10
2 3
0
1
8
5
2
7
5
y
x
Q:
(u, 8) (v, 13)
5 6
7
2
7
y
31
Kapitel 9.4: Minimale Spannbäume
• Spannbaum: Teilgraph, der Baum ist und alle Knoten enthält
• minimaler Spannbaum: Spannbaum mit minimalem Gewicht
• Prim Algorithmus: Greedy-Algorithmus, O(|E | log |V |)
• erweitere aktuelle Lösung um Kante mit minimalen Gewicht
heraus aus Menge aktueller Knoten
• entscheidendes
Hilfsmittel: Priority
Beispiel-Ablauf:
PrimQueue
Algorithmus
4
1
2
3
6
5
3
2
6
4
3
6
6
1
2
3
4
1
5
2
4
1
5
2
3
2
1
3
2
6
1
32
4
Kapitel 10: Numerische Algorithmen
10.1 Matrizen
10.2 Lineare Gleichungen
10.3 Least squares Probleme
10.4 Fast Fourier Transform
33
Kapitel 10.1: Matrizen
Strassen-Algorithmus
• Berechne:
q1 = (a11 + a22 ) · (b11 + b22 )
• Matrix als Element von Vektorraum, lineare Abbildung,
q2 = (a21 + a22 ) · b11
Anordnung von Zahlen
q3 = a11 · (b12
b22 )
• Matrix-Operationen:
q4 Addition,
= a22 · (b21 Skalar-Multiplikation,
b11 )
Matrix-Multiplikation
q5 = (a11 + a12 ) · b22
q6 = (a21 a11 ) · (b11 + b12 )
• Matrix-Multiplikation:
3
• regulär: O(n ) q7 = (a12 a22 ) · (b21 + b22 )
• Strassen (Divide and Conquer): O(n2.807 )
• Dann ist:
A·B =
✓
q1 + q4 q5 + q7
q3 + q5
q2 + q4
q1 + q3 q 2 + q 6
◆
• Komplexität: ⇥(nlg 7 ) = ⇥(n2.807 )
41
34
Kapitel 10.2: Lineare Gleichungen
• Lineare Gleichung: aT x = b
• Lineares Gleichungssystem: Ax = b
• Anzahl Lösungen: keine, eine oder unendlich viele
• Lösen von linearen Systemen:
• mit Inverser A−1 (numerisch nicht stabil)
• mit Gauss-Elimination (numerisch nicht stabil)
• mit Zerlegung und Vorwärts-/Rückwärts-Substitution
(stabil mit geeigneter Zerlegung)
• mit iterativen Verfahren
35
Kapitel 10.2: Lineare Gleichungen
• Matrix-Zerlegungen:
3
• Cholesky-Zerlegung für symm. pos. def. Matrizen ( n3 FLOPs)
3
• LUP-Zerlegung für invertierbare Matrizen ( 2n3 FLOPs)
3
• QR-Zerlegung für invertierbare Matrizen ( 2n3 FLOPs)
• SVD-Zerlegung für beliebige Matrizen (2mn2 + 2n3 FLOPs)
• Berechnung der LUP-Zerlegung:
• rekursive Berechnung von Gauss-Eliminations-Schritten
(Faktorisierung mittels Schur-Komplement)
• partielles Pivoting zur Vermeiden von Division durch 0 und
besserer Stabilität
36
Kapitel 10.3: Least squares Probleme
• minimiere Approximationsfehler
ηj = F (xj ) − yj
Least-squares Lösung
P
für Datenpunkte (xj , yj ) und Funktion F (x) = i ci fi (x)
Least-squares Lösung
Sei A 2 Rm⇥n , y 2 Rm mit m
Minimierungs-Problems
min kAc
c
yk
n. Eine Lösung c 2 Rn des
or
min kAc
c
y k2
heißt Least-squares Lösung.
• Normalengleichung:
Anwendungs-Beispiele:
• Tracking von Objekten mit Kameras
T
T
= A yetc.
A AcRobotern,
• Kalibrierung von Kameras,
• Iterative Rekonstruktion für Tomographie
• Pseudoinverse:
A+ = (AT A)−1 AT
31
37
Kapitel 10.4: Fast Fourier Transform
• Polynome in Koeffizientendarstellung:
A(x) =
n−1
X
aj x j
j=0
• Operationen:
• Auswertung: O(n) mit Horner-Schema
• Addition: O(n)
• Multiplikation: O(n2 )
• Faltung zweier Vektoren entspricht Polynom-Multiplikation
38
Kapitel 10.4: Fast Fourier Transform
• Polynome in Stützstellendarstellung:
(x0 , y0 ), (x1 , y1 ), . . . , (xn−1 , yn−1 )
• Operationen:
• Addition: O(n)
• Multiplikation: O(n)
• Konversion zwischen Darstellungen:
• Koeffizienten → Stützstellen: Auswertung mit FFT O(n log n)
• Stützstellen → Koeffizienten: Interpolation mit IFFT
O(n log n)
39
Kapitel 10.4: Fast Fourier Transform
• Effiziente Faltung / Polynom-Multiplikation:
Koeffizientendarstellung
A, B
Multiplikation
Zeit: Θ(n2)
Koeffizientendarstellung
C = AB
Auswertung
Zeit: Θ(n log n)
Stützstellendarstellung
A, B
Interpolation
Zeit: Θ(n log n)
Multiplikation
Zeit: Θ(n)
Stützstellendarstellung
C = AB
• Diskrete Fourier Transformation: Polynom-Auswertung an
n-ten komplexen Einheitswurzeln, O(n2 )
• Fast Fourier Transformation: DFT mit Divide and Conquer
und Halbierungslemma, O(n log n)
• Implementierung z.B. entrekursiviert mit Butterfly-Schema
40
Kapitel 11: Datenkompression
Nicht Klausur-relevant!
11.1 Einführung
11.2 Grundlagen der Informationstheorie
11.3 Huffman Codes
11.4 LZ77 und LZ78 (6. Februar)
11.5 JPEG (6. Februar)
41
Kapitel 12: Kryptographie
Nicht Klausur-relevant!
12.1 Einführung (7. Februar)
12.2 Symmetrische Verschlüsselung (7. Februar)
12.3 RSA (7. Februar)
42
Herunterladen