Prof. Dr. O. Drobnik Robert-Mayer-Str. 11-15 Tel.: +049-(0)69-798- 28362 Yann Lorion Robert-Mayer-Str. 11-15 Tel.: +049-(0)69-798-28358 [email protected] Vorlesung PRG-1, WS 08/09 Ausgabe: 03.12.2008 Abgabe: 10.12.2008 Übungsblatt 7 Bemerkung: Es dürfen keine Lösungen aus dem Skript, dem Internet oder anderen Quellen „abgeschrieben“ werden. Diese Quellen dürfen nur mit Quellenangaben verwendet werden und es muss ein Eigenanteil in den Lösungen deutlich erkennbar sein. Es ist also notwendig, die Themen möglichst gut zu verstehen, um dann die Antworten auf die gestellten Fragen mit eigenen Worten formulieren zu können. Aufgabe 7.1: Funktionsweise fremder Programme identifizieren (2 Punkte) Gegeben ist folgendes Programm def unbekannt(input): result = [] a = len(input) b = 0 while a > b: temp = [] c = b while c < a: temp.append(input [b]) result.append(temp) c += 1 b += 1 return result Beschreiben Sie, was der Aufruf unbekannt(input) auf einer Liste bewirkt und begründen Sie Ihre Antwort. Aufgabe 7.2 Greedy - Sortieren (4 Punkte) Programmieren Sie folgenden Greedy-Sortieralgorithmus: Eingabe: Liste L mit Elementen der natürlichen Zahlen Ausgabe: Sortierte Liste Vergleichen Sie der Reihe nach zwei benachbarte Elemente der Liste und vertauschen Sie diese, falls sie in der falschen Reihenfolge vorliegen. Gehen Sie wiederholt die Liste durch, bis sie sortiert ist und geben Sie diese zurück. Überlegen Sie sich drei zu sortierende Listen und begründen Sie, warum diese Listen besonders zum Testen geeignet sind (mindestens drei Listen mit mehr als 10 Elementen). Seite 1/2 Prof. Dr. O. Drobnik Robert-Mayer-Str. 11-15 Tel.: +049-(0)69-798- 28362 Yann Lorion Robert-Mayer-Str. 11-15 Tel.: +049-(0)69-798-28358 [email protected] Vorlesung PRG-1, WS 08/09 Ausgabe: 03.12.2008 Abgabe: 10.12.2008 Aufgabe 7.3 Lerngruppenaufgabe: Divide-and-Conquer (4 Punkte) Gegeben sei eine Liste list von natürlichen Zahlen (int). Implementieren Sie in Python eine Funktion smallestDistance(list), die die kleinste positive Differenz zwischen zwei Zahlen der Liste zurückgibt. Die Lösung dieser Aufgabe soll nach dem divide-and-conquer Prinzip erfolgen. Hierzu muss die Liste in zwei Teillisten geteilt werden, auf denen die Funktion rekursiv aufgerufen wird. Überlegen Sie sich, welche Probleme hierbei auftauchen und wie Sie diese beheben können. Überlegen Sie sich Fälle, die genau diese Probleme testen. Hinweis: Die Liste darf von Ihrer Funktion sortiert werden. Aufgabe 7.4 Bonusaufgabe - Mergesort (3 Punkte) Verändern Sie die in der Vorlesung vorgestellte Funktion merge(l1,l2) auf folgende Weise: • Die Funktion merge(l1,l2) erhält als Eingabe zwei sortierte Listen l1 und l2. • Daraufhin wird eine Liste lst erzeugt, die aus der Konkatenation von l1 und der umgedrehten Liste l2 entsteht. Somit stehen die kleinsten Werte am Anfang und am Ende von lst und die größten Werte in der Mitte. • Zu Beginn wird der erste und der letzte Eintrag der Liste mit einander verglichen und der kleinere von beiden in eine Ergebnisliste geschrieben. Sollte der erste Wert aus lst der kleinere gewesen sein, so wird im nächsten Schritt der zweite mit dem letzten Wert verglichen (andernfalls der erste mit dem vorletzten) und wieder der kleinere in die Ergebnisliste eingefügt, etc. • Die Rückgabe von merge(l1,l2) ist eine sortierte Liste, die alle Elemente aus l1 und l2 enthält. Was ist der Vorteil gegenüber der in der Vorlesung vorgestellten Methode? Benutzen Sie die gleichen Testlisten wie in Aufgabe 7.2. Seite 2/2