Sommersemester 2015 - CAMP-TUM

Werbung
Übung zu
Algorithmen und Datenstrukturen (für ET/IT)
Sommersemester 2015
Matthias Wieczorek
Computer-Aided Medical Procedures
Technische Universität München
Administratives
I
Zentralübung (Mittwoch, 09:45 – 11:15)
I
I
I
I
Tutorfragestunden
I
I
I
I
I
I
Besprechung des Aufgabenblattes der Vorwoche
Fragen von allgemeinem Interesse
Probeklausur
Dienstag, 15:00 – 17:00, Raum 0999
Freitag, 09:00 - 11:00, Raum 0999
Detailliertere und individuelle Fragen
Kontakt-E-Mail: [email protected]
Sprechstunde (Termin per E-Mail)
Moodle
I
I
https://www.moodle.tum.de/course/view.php?id=17994
Diskussionsforum & Bekanntmachungen
http://campar.in.tum.de/Chair/TeachingSs15AuD
2/37
Website
3/37
onlineTED
I
https://www.onlineted.de
I
Webbasiertes Abstimmungssystem
I
Live-Umfragen in Lehrveranstaltungen
4/37
onlineTED
5/37
Euklidischer Algorithmus
Wenn CD aber AB nicht misst, und man nimmt bei AB, CD
”
abwechselnd immer das kleinere vom größeren weg, dann muss
(schließlich) eine Zahl übrig bleiben, die die vorangehende misst.“
aus Euklid: Die Elemente, Buch VII (Clemens Thaer)
I
Vorschrift zur Berechnung des größten gemeinsamen Teilers
I
Keine Definition des ggT im mathematischen Sinn
I
Verschiedene Algorithmen mit gleichem Ziel (
Sortierung!)
6/37
Ablauf nach Originalformulierung
AB = 11
CD = 4
0 Rechenschritte
7/37
Ablauf nach Originalformulierung
AB = 7 = 11 − CD
CD = 4
1 Rechenschritt
7/37
Ablauf nach Originalformulierung
AB = 3 = 7 − CD
CD = 4
2 Rechenschritte
7/37
Ablauf nach Originalformulierung
AB = 3
CD = 1 = 4 − AB
3 Rechenschritte
7/37
Ablauf nach Originalformulierung
AB = 2 = 3 − CD
CD = 1
4 Rechenschritte
7/37
Ablauf nach Originalformulierung
AB = 1 = 2 − CD
CD = 1
5 Rechenschritte
7/37
Ablauf nach Originalformulierung
AB = 1
CD = 1
⇒ ggT (11, 4) = 1
11 ist eine Primzahl!
5 Rechenschritte
7/37
Algorithmus
I
I
präzise/eindeutige, endliche Beschreibung
Bausteine:
I
I
I
I
Elementarer Verarbeitungsschritt
Sequenz (Abfolge elementarer Schritte)
Bedingter Verarbeitungsschritt
Wiederholung
8/37
Variablen
I
Speicherung von Werten mittels Typ-behafteter, eindeutig
benannter Variablen
I
I
I
I
I
I
int für ganze Zahlen (Integer)
double für Fließkommazahlen (Double Precision Floating
Point)
char für Zeichen (Character)
...
Zuweisung über =
Kurze Schreibweise für Updates
I
I
i *= 4; statt i = i * 4; (ebenso +=, -=, *=, /=, ...)
i++; statt i = i + 1; (ebenso --)
int i = 23;
int j = 2 * (i -2);
char s = ’a ’;
// Klammerung !
9/37
Elementarer Verarbeitungsschritt
I
Mathematische Operatoren +, -, *, /, . . .
I
Zuweisungen =, +=, -=, *=, /=, . . .
I
...
10/37
Sequenz
int i = 10;
i = i +2; // Wert von i ist 12
11/37
Bedingter Verarbeitungsschritt
I
if (b) {...}
I
if (b) {...} else {...}
I
if (b) {...} else if (...) {...} else {...}
I
Klammern {...} zur Sicherheit immer schreiben
I
b steht für einen logischen Ausdruck oder eine logische
(boolsche) Variable:
12/37
Logische Ausdrücke
I
Logischer Typ (bool) mit Werten true (wahr, 1) und false
(unwahr, 0)
I
Vergleichs-Operatoren: == (gleich), != (ungleich), <, <=, ...
I
Verknüpfungen: && (AND; beide wahr), || (OR; mindestens
eines von beiden wahr), ...
I
Negation: !a (NOT)
13/37
Wiederholung
Schleifen für Wiederholungen
I
while (b) {...} (Test vor jeder Iteration)
I
do {...} while (b); (Test nach jeder Iteration)
I
for i = 1...100 {...} (Gewisse Anzahl an Iterationen)
14/37
Pseudocode
I
Informelle Veranschaulichung eines Algorithmus
I
Identifizierung der elementaren Bausteine nicht offensichtlich
Input: Natürliche Zahlen a,b
Output: ggT(a,b)
euklid(a,b):
I
I
Falls a = 0, liefere b zurück
Solange b > 0 wiederhole
I
I
I
Falls a > b setze a = a − b
sonst setze b = b − a
Liefere a zurück
15/37
Beispiel Programmiersprache: C
I
Kompilierte Sprache, sehr effizient
int euklid ( int a , int b )
{
if ( a ==0)
return b ;
while (b >0)
{
if (a > b )
a = a - b;
else
b = b - a;
}
return a ;
}
16/37
Konvention der Vorlesung
I
Pseudocode + C Syntax
Input: Natürliche Zahlen a,b
Output: ggT(a,b)
euklid(a,b):
{
if ( a ==0)
return b ;
while (b >0)
{
if (a > b )
a = a - b;
else
b = b - a;
}
return a ;
}
17/37
Konvention der Vorlesung – Funktionsdefinition
Input: Natürliche Zahlen a,b // Einsprungspunkt
Output: ggT(a,b) // Aus -/ Rückgabe
euklid(a,b): // Funktionsname
{
if ( a ==0)
return b ;
while (b >0)
{
if (a > b )
a = a - b;
else
b = b - a;
}
return a ;
}
I
Aufruf mittels euklid(a,b) (z.B. euklid(6,3))
18/37
Konvention der Vorlesung – Identifikation der Bausteine
Input: Natürliche Zahlen a,b
Output: ggT(a,b)
euklid(a,b):
{ // Beginn einer Sequenz
if ( a ==0) // Bedingter V e r a r b e i t u n g s s c h r i t t
return b ; // Elementarer V e r a r b e i t u n g s s c h r i t t
while (b >0) // Wiederholung
{ // Beginn einer Sequenz
if (a > b ) // Bedingter V e r a r b e i t u n g s s c h r i t t
a =a - b ; // Elementarer V e r a r b e i t u n g s s c h r i t t
else // Bedingter V e r a r b e i t u n g s s c h r i t t
b =b - a ; // Elementarer V e r a r b e i t u n g s s c h r i t t
} // Ende einer Sequenz
return a ; // Elementarer V e r a r b e i t u n g s s c h r i t t
} // Ende einer Sequenz
19/37
Ablauf nach Originalformulierung
AB = 11
CD = 4
0 Rechenschritte
20/37
Ablauf nach Originalformulierung
AB = 7 = 11 − CD
CD = 4
1 Rechenschritt
20/37
Ablauf nach Originalformulierung
AB = 3 = 7 − CD
CD = 4
2 Rechenschritte
20/37
Ablauf nach Originalformulierung
AB = 3
CD = 1 = 4 − AB
3 Rechenschritte
20/37
Ablauf nach Originalformulierung
AB = 2 = 3 − CD
CD = 1
4 Rechenschritte
20/37
Ablauf nach Originalformulierung
AB = 1 = 2 − CD
CD = 1
5 Rechenschritte
20/37
Ablauf nach Originalformulierung
AB = 1
CD = 1
⇒ ggT (11, 4) = 1
11 ist eine Primzahl!
5 Rechenschritte
20/37
Beobachtung
AB = 11 = 2 · CD + 3
AB
:
CD
=
−
11
8
3
:
4
=
2
I
Die Modulo-Berechnung liefert den Rest nach Teilung.
I
Wir schreiben 11 mod 4 = 3 ...
I
... und programmieren int rest = 11 % 4;
21/37
Ablauf mit Modulo
AB = 11
CD = 4
0 Rechenschritte
22/37
Ablauf mit Modulo
AB = 3 = 11 mod CD
CD = 4
1 Rechenschritt
22/37
Ablauf mit Modulo
AB = 3
CD = 1 = 4 mod AB
2 Rechenschritte
22/37
Ablauf mit Modulo
AB = 0 = 3 mod CD
=⇒ AB = CD = 1
CD = 1
⇒ ggT (11, 4) = 1
Abbruch bei Rest 0!
3 Rechenschritte
22/37
Caveat
I
Die Zählung von Rechenschritten ist stark vereinfachend!
I
Tatsächlich dauert die Berechnung einer Teilung (bzw. einer
Modulo-Operation) erheblich länger als eine Differenz!
23/37
Implementierung via Modulo
Input: Natürliche Zahlen a,b
Output: ggT(a,b)
euklid modulo(a,b):
{
while ( b != 0)
{
int rest = a % b ;
a = b;
b = rest ;
}
return a ;
}
24/37
Rekursion
I
Funktionen rufen sich selbst wieder auf, nachdem die
Parameter geändert wurden.
I
Abbruchbedingungen beenden diese Kette von Aufrufen.
I
Beispiel: Addition der Zahlen m bis n
25/37
Iterative Variante
Input: Natürliche Zahlen m,n
Output: Summe der Zahlen m bis n
summe iterativ(m,n):
{
int wert = 0;
for ( int i = m ; i <= n ; ++ i )
wert += i ;
return wert ;
}
26/37
Rekursive Variante
Input: Natürliche Zahlen m,n
Output: Summe der Zahlen m bis n
summe rekursiv(m,n):
{
if ( m > n )
return 0;
else
return m + summe_rekursiv ( m +1 , n );
}
27/37
Aufrufkette
I
summe rekursiv(2, 4) +(0)
I
2 + summe rekursiv(3, 4)
I
2 + 3 + summe rekursiv(4, 4)
I
2 + 3 + 4 + summe rekursiv(5, 4)
I
2 + 3 + 4 + 0 +(0)
I
2 + 3 + 4 +(0)
I
2 + 7 +(0)
I
9 +(0)
28/37
ggT mit Rekursion
I
Mittels dreier Eigenschaften läßt sich der ggT rekursiv
berechnen:
ggT(ab, cd) = ggT(cd, ab)
(1)
ggT(ab, cd) = ggT(ab, cd mod ab)
(2)
ggT(ab, cd) = ggT(ab, cd + λ · ab)
(3)
29/37
Implementierung via Rekursion
Input: Natürliche Zahlen a,b
Output: ggT(a,b)
euklid rekursiv(a,b):
{
if ( b ==0)
return a ;
else if ( a ==0)
return b ;
else if (a > b )
return euklid_rekursiv (a -b , b );
else
return euklid_rekursiv (a , b - a );
}
30/37
Implementierung via Rekursion und Modulo
Input: Natürliche Zahlen a,b
Output: ggT(a,b)
euklid rekursiv modulo(a,b):
{
if ( b ==0)
return a ;
else
return e uk l i d _ r e k u r s i v _ m o d u l o (b , a % b );
}
31/37
Apropos...
I
ggT via Primfaktorzerlegung?
32/37
Zusammenfassung
I
I
Feststellung: Unterschiedliche Algorithmen für die selbe
Aufgabe
Angenommen eine Aufgabe sei gegeben (z.B.: Automatisierte
Sortierung von Paketen)
I
I
I
Welche Algorithmen eignen sich hierzu?
Welche Unterschiede gibt es
Welcher Algorithmus eigenen sich am besten?
33/37
Herunterladen