Algorithmen und Datenstrukturen

Ähnliche Dokumente
Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Aufgabe 8. 1 Arbeitsweise illustrieren. 2 Korrektheitsbeweis führen. 3 Laufzeitanalyse durchführen.

Vorlesung Datenstrukturen

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

2 Sortieren durch Vergleichen Eingabefolge a 1, a 2,..., a n 2, 1, 3 Sortieralg. Für festes n ist ein vergleichsbasierter Sortieralg. charakterisiert

Problem: Gegeben Spezifikation (P,Q) und Implementierung S Gesucht formaler (automatisierbarer?) Beweis, dass S (P,Q) erfüllt.

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 9. Sortieren

Algorithmen und Datenstrukturen

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

DAP2 Probeklausur. Matrikelnummer Vorname Nachname. Datum: 24. Juli C. Sohler A. Krivo²ija, A. Rey, H. Sandvoÿ

Datenstrukturen und Algorithmen Beispiellösung zu Heimübungsblatt 7. Abbildung 1: Das Array A als Baum (vgl. Foliensatz 16, Folie 3)

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Sortieren II / HeapSort Heaps

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Algorithmen und Datenstrukturen Kapitel 2: Korrektheit von Algorithmen und Laufzeitanalyse rekursiver Algorithmen (mittels Rekurrenzgleichungen)

Algorithmen und Datenstrukturen

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Kapitel 3 Zur Korrektheit und Effizienz von Algorithmen

1. Übung Algorithmen I

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Elementare Sortierverfahren

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen

Informatik II Sortieren

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

A3.1 Sortieralgorithmen

Aufgabe 2 Konstruktion von Binärbäumen Tafelübung

Tutoraufgabe 1 (Hoare-Kalkül):

Abschnitt: Algorithmendesign und Laufzeitanalyse

2. Grundlagen. Beschreibung von Algorithmen durch Pseudocode. Korrektheit von Algorithmen durch Invarianten.

Informatik II, SS 2014

Kapitel 3: Sortierverfahren Gliederung

Ordnen Sie die folgenden Funktionen nach ihrer asymptotischer Komplexität in aufsteigender Reihenfolge: i=1 4i + n = 4 n. i=1 i + 3n = 4 ( n(n+1)

3. Inkrementelle Algorithmen

Datenstrukturen und Algorithmen

Aufgabe (Schreibtischtest, Algorithmenanalyse)

Grundlagen: Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

Übung zur Vorlesung Programmierung

3.2. Korrektheit und Komplexität am Beispiel: Sortieren Sortieren ist eine wichtige Basis-Operation für komplexe Algorithmen

Algorithmen & Komplexität

Suchen und Sortieren Sortieren. Mergesort

3. Übungsblatt zu Algorithmen I im SoSe 2017

(08 - Einfache Sortierverfahren)

Algorithmen und Datenstrukturen

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 25

Übung Algorithmen und Datenstrukturen

Einführung in die Informatik I Kapitel II.3: Sortieren

Algorithmen und Datenstrukturen

6 Quicksort. die mittlere Laufzeit Θ(n log n) beträgt und. die in der asymptotischen Notation verborgenen Konstanten sehr klein sind.

Schleifeninvarianten. Dezimal zu Binär

Algorithmen und Datenstrukturen 2

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Tutoraufgabe 1 (Sortieralgorithmus):

Tag 3 Repetitorium Informatik (Java)

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

Kapitel 8 Fortgeschrittene Sortieralgorithmen

2.4 Schleifen. Schleifen unterscheiden sich hinsichtlich des Zeitpunktes der Prüfung der Abbruchbedingung:

Vorlesung Datenstrukturen

Kapitel 6 Elementare Sortieralgorithmen

Lineare Programmierung

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

INFORMATIK FÜR BIOLOGEN

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Transkript:

Algorithmen und Datenstrukturen Wintersemester 2013/14 1. Vorlesung Kapitel 1: Sortieren Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I

Das Problem Eingabe Gegeben: eine Folge A = a 1, a 2,..., a n von n Zahlen Umordnung Algorithmus Gesucht: eine Permutation a 1, a 2,..., a n von A, so dass a 1 a 2... a n Ausgabe Beachte: Computerinterne Zahlendarstellung hier unwichtig! Wichtig: Je zwei Zahlen lassen sich vergleichen. Ein Vergleich dauert konstante Zeit, d.h. die Dauer ist unabhängig von n. Noch was: 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1

Frage an alle Erstis Wie sortieren Sie?

Eine Lösung InsertionSort Linke Hand anfangs leer. Alle Karten liegen auf dem Tisch. Rechte Hand nimmt Karten nacheinander auf und steckt sie (von rechts kommend) an die richtige Position zwischen die Karten in der linken Hand. inkrementeller Alg. Linke Hand hält immer eine sortierte Reihenfolge aufrecht. Invariante! Korrektheit: am Ende sind alle Karten in der linken Hand und zwar sortiert!

Ein inkrementeller Algorithmus // In Pseudocode IncrementalAlg( array of... A ) }{{}}{{} Name des Alg. Eingabe Typ der Eingabe Variable

Ein inkrementeller Algorithmus // In Pseudocode IncrementalAlg( array of... A ) berechne Lösung für A[1] // Initialisierung // Schleifenkopf Zuweisungoperator in manchen Sprachen j := 2 in manchen Büchern j 2 in Java j = 2

Ein inkrementeller Algorithmus // In Pseudocode IncrementalAlg( array of... A ) berechne Lösung für A[1] // Initialisierung // Schleifenkopf Anzahl der Elemente des Feldes A Zuweisungoperator in manchen Sprachen j := 2 in manchen Büchern j 2 in Java j = 2

Ein inkrementeller Algorithmus // In Pseudocode IncrementalAlg( array of... A ) berechne Lösung für A[1] // Initialisierung // Schleifenkopf // Schleifenkörper; wird (A.length 1)-mal durchlaufen berechne Lösung für A[1..j] mithilfe der für A[1..j 1] return Lösung // Ergebnisrückgabe Teilarray von A mit den Elementen A[1], A[2],..., A[j]

Ein inkrementeller Algorithmus InsertionSort IncrementalAlg( array of. int.. A ) berechne Lösung für A[1] // nix zu tun: A[1..1] ist sortiert // berechne Lösung für A[1..j] mithilfe der für A[1..j 1]... kommt noch... return Lösung // nicht nötig das aufrufende Programm hat Zugriff auf das sortierte Feld A

Ein inkrementeller Algorithmus InsertionSort IncrementalAlg( array of. int.. A ) berechne Lösung für A[1] // nix zu tun: A[1..1] ist sortiert // berechne Lösung für A[1..j] mithilfe der für A[1..j 1] // hier: füge A[ j] in die sortierte Folge A[1..j 1] ein key = A[ j] i = j 1 while i > 0 and A[i] > key do Wie A[i + verschieben 1] = A[i] wir die Einträge i = igrößer 1 key nach rechts? A[ j] A[1..j 1] key = 3 {}}{ 2 4 4 7 3 1 8 6 1 i j

Ein inkrementeller Algorithmus InsertionSort IncrementalAlg( array of. int.. A ) berechne Lösung für A[1] // nix zu tun: A[1..1] ist sortiert // berechne Lösung für A[1..j] mithilfe der für A[1..j 1] // hier: füge A[ j] in die sortierte Folge A[1..j 1] ein key = A[ j] i = j 1 while i > 0 and A[i] > key do A[i + 1] = A[i] i = i 1 A[i + 1] = key A[ j] A[1..j 1] key = 3 {}}{ 2 4 4 7 3 1 8 6 1 i j

Fertig? Nicht ganz... Wir interessieren uns heute (und im Rest dieser Vorlesung) für folgende zentrale Fragen: Ist der Algorithmus korrekt? Wie schnell ist der Algorithmus? Wie viel Speicherplatz benötigt der Algorithmus?

Korrektheit beweisen InsertionSort(array of int A) key = A[j] i = j 1 while i > 0 and A[i] > key do A[i + 1] = A[i] i = i 1 A[i + 1] = key Hier enthält A[1..j 1] dieselben Elemente wie zu Beginn des Algorithmus jedoch sortiert. Idee der Schleifeninvariante: Wo? Was? am Beginn jeder Iteration der for-schleife... WANTED: Bedingung, die a) an dieser Stelle immer erfüllt ist und b) bei Abbruch der Schleife Korrektheit liefert

Korrektheit beweisen InsertionSort(array of int A) key = A[j] i = j 1 while i > 0 and A[i] > key do A[i + 1] = A[i] i = i 1 Hier enthält A[1..j 1] dieselben Elemente wie zu Beginn des Algorithmus jedoch sortiert. Schleifeninvariante A[i + 1] = key Beweis nach Schema F : Wir brauchen noch drei Zutaten... 1.) Initialisierung Zeige: Hier: Invariante ist beim 1. Schleifendurchlauf erfüllt. klar, denn für j = 2 gilt: A[1..j 1] = A[1..1] ist unverändert und sortiert.

Korrektheit beweisen InsertionSort(array of int A) key = A[j] i = j 1 while i > 0 and A[i] > key do A[i + 1] = A[i] i = i 1 Hier enthält A[1..j 1] dieselben Elemente wie zu Beginn des Algorithmus jedoch sortiert. Schleifeninvariante A[i + 1] = key Beweis nach Schema F : Wir brauchen noch drei Zutaten... 1.) Initialisierung Zeige: Hier: 2.) Aufrechterhaltung Wenn die Invariante vor dem j. Schleifendurchlauf erfüllt ist, dann auch vor dem j + 1. Eigentlich: Invariante für while-schleife aufstellen und beweisen!

Korrektheit beweisen InsertionSort(array of int A) key = A[j] i = j 1 while i > 0 and A[i] > key do A[i + 1] = A[i] i = i 1 Hier enthält A[1..j 1] dieselben Elemente wie zu Beginn des Algorithmus jedoch sortiert. Schleifeninvariante A[i + 1] = key Beweis nach Schema F : Wir brauchen noch drei Zutaten... 1.) Initialisierung Zeige: Hier: 2.) Aufrechterhaltung Wenn die Invariante vor dem j. Schleifendurchlauf erfüllt ist, dann auch vor dem j + 1. Beob.: Elemente werden so lange nach rechts geschoben wie nötig. key wird korrekt eingefügt.

Korrektheit beweisen InsertionSort(array of int A) key = A[j] i = j 1 while i > 0 and A[i] > key do A[i + 1] = A[i] i = i 1 Hier enthält A[1..j 1] dieselben Elemente wie zu Beginn des Algorithmus jedoch sortiert. Schleifeninvariante A[i + 1] = key Beweis nach Schema F : Wir brauchen noch drei Zutaten... 1.) Initialisierung Zeige: Hier: 2.) Aufrechterhaltung 3.) Terminierung Zusammengenommen ergeben Invariante und verletzte Schleifenbedingung die Korrektheit. Verletzte Schleifenbedingung ist j > A.length. D.h. j = A.length + 1. Einsetzen in Inv. korrekt!

Selbstkontrolle Programmieren Sie InsertionSort in Java! Lesen Sie Kapitel 1 und Zählen Sie Vergleiche Anhang A des Buchs von für verschiedene Eingaben. Cormen et al. durch und machen Sie dazu so viel Übungsaufgaben wie möglich! Bringen Sie Fragen in die Übung mit! Bleiben Sie von Anfang an am Ball! Schreiben Sie sich in die Vorlesung ein: wuecampus2.uni-wuerzburg.de https://www-sbhome1.zv.uni-wuerzburg.de