Krawatterätsel - Verbesserung der oberen Schranke

Ähnliche Dokumente
Lösungsvorschlag Serie 2 Rekursion

Übersicht über Informatik und Softwaresystemtechnik WS 99/00, Prof. Dr. Andreas Schwill

Vorkurs Mathematik für Informatiker Kombinatorik --

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

Einstieg in die Informatik mit Java

Übung zur Vorlesung Berechenbarkeit und Komplexität

Inhalt. 3. Spezielle Algorithmen

Suchen und Sortieren

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

Informatik I: Einführung in die Programmierung

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

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

Randomisierte Algorithmen 2. Erste Beispiele

Übung zur Vorlesung Berechenbarkeit und Komplexität

Einschub: Anweisungen und Bedingungen für PAP und Struktogramme (1)

Permutationen und symmetrische Gruppe

Effiziente Algorithmen

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen Definition, Eigenschaften, Entwurf Darstellung von Algorithmen Beispiele.

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

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

Algorithmen in Zellularautomaten

2.3.1 Einleitung Einfache Sortierverfahren Höhere Sortierverfahren Komplexität von Sortierverfahren Spezielle Sortierverfahren

Suchen und Sortieren

Algorithmen & Programmierung. Rekursive Funktionen (1)

Funktionale Programmierung. Funktionale Programmierung: Vorlesungsüberblick. Eigenschaften rein funktionaler Programmierung

Algorithmen & Datenstrukturen 1. Klausur

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Viel Spaÿ! Aufgabe 0.1. Laufzeit unter Verdoppelung (-)

Effiziente Algorithmen und Datenstrukturen I. Kapitel 10: Lineare Algebra

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

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

1. Übungsblatt zu Algorithmen II im WS 2011/2012

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Der folgende Vortrag basiert auf dem Text A Polynomial Time Algorithm for the N-Queens Problem von Rok Sosic und Jun Gu aus dem Jahre 1990.

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

Algorithmen und Datenstrukturen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Quicksort ist ein Divide-and-Conquer-Verfahren.

Zusammenfassung Stochastik

7. Sortieren Lernziele. 7. Sortieren

Algorithmen & Komplexität

GTI. Hannes Diener. 18. Juni. ENC B-0123,

Vom Leichtesten zum Schwersten Sortieralgorithmen

2. Algorithmenbegriff

Algorithmen und Datenstrukturen 1

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Algorithmen und Datenstrukturen 1. EINLEITUNG. Algorithmen und Datenstrukturen - Ma5hias Thimm 1

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Induktion und Rekursion

Tutoraufgabe 1 (Hoare-Kalkül):

Datenstrukturen & Algorithmen

Einführung in die Informatik 1

15. Elementare Graphalgorithmen

Grundlagen der Programmierung 2. Sortierverfahren

Natürliche Zahlen, Summen und Summenformeln

Einführung in die Informatik I

2. Musterlösung. Problem 1: Least Common Ancestor

Präzedenz von Operatoren

Grundlagen der Theoretischen Informatik

Tag der Mathematik 2016

Grundlegende Sortieralgorithmen

Elementare Mengenlehre

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Kombinatorische Optimierung

Abstrakte Algorithmen und Sprachkonzepte

Vorab : Von dem indischen Mathematiker D. R. Kaprekar stammt folgender Zusammenhang :

Grundlagen: Algorithmen und Datenstrukturen

Abschnitt: Algorithmendesign und Laufzeitanalyse

Komplexität von Algorithmen

JAVA - Suchen - Sortieren

Algorithmen und Datenstrukturen

Vollständige Induktion

Klausurvorbereitung für die Semesterferien - 20 Aufgaben -

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Graphentheorie. Eulersche Graphen. Eulersche Graphen. Eulersche Graphen. Rainer Schrader. 14. November Gliederung.

Algorithmen und Datenstrukturen VO 3.0 Vorlesungsprüfung 19. Oktober 2007

Übung zur Vorlesung Einführung in die Computerlinguistik und Sprachtechnologie

Universität Karlsruhe (TH) Algorithmen für Rechnerbündel III

Folge 13 - Quicksort

Übung Datenstrukturen. Sortieren

BUBBLE SORT. Können wir die gefundenen Algorithmen auch auf Listen mit mehr als drei Elementen ausdehnen?

Datenstrukturen und Algorithmen

11.1 Grundlagen - Denitionen

Dynamisches Huffman-Verfahren

Beim rekursiven Aufruf einer Funktion wird jeweils ein Duplikat der gesamten Funktion im Speicher abgelegt.

Universität des Saarlandes

Sortieren durch Einfügen. Prof. Dr. W. Kowalk Sortieren durch Einfügen 1

= 7 (In Binärdarstellung: = 0111; Unterlauf) = -8 (In Binärdarstellung: = 1000; Überlauf)

Theoretische Informatik 1

Programmiertechnik II

Überblick. Lineares Suchen

Kapitel 5: Dynamisches Programmieren Gliederung

Klausur Algorithmen und Datenstrukturen II 10. August 2015

2. Symmetrische Gruppen

Informatik I. Informatik I Iteration vs. Rekursion. Iteration vs. Rekursion Iteration vs. Rekursion. 20. Iteration vs.

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Grundlagen der Programmierung

Überblick. TSP Vergleich der Lösungen. Das Travelling Salesman Problem. Nearest-Neighbor Heuristik für TSP

Kap. 7.1 Heuristiken Kap. 7.2 Approximative Algorithmen und Gütegarantien

Transkript:

Krawatterätsel - Verbesserung der oberen Schranke Felix Kälberer, Matthias Nieser, Ulrich Reitebuch 29. Dezember 2008 Zusammenfassung Die folgenden Seiten beschreiben neue Erkenntnisse im Krawattenrätsel. Wir können noch keinen optimalen Algorithmus angeben, aber die obere Schranke auf 2/3 n 2 2/3 Vertauschungen verbessern. Der hier angegebene Algorithmus liegt somit nur um höchstens n/3 Vertauschungen vom Optimum entfernt. Für n = 2 j + 1, j N ist der Algorithmus sogar optimal und benötigt nur 2/3n 2 n/3 viele Vertauschungen. 1 Notation Gegeben seien n Töpfe, die von 0 bis n 1 aufsteigend nummeriert sind. Jeder Topf i enthalte zwei Kugen mit den Nummern 2n 2i 1 und 2n 2i 2. Ziel ist es, die Kugeln so zu sortieren, dass in Topf i die Nummern 2i und 2i + 1 liegen. Diese Nummerierung weicht etwas von der originalen Nummerierung in der Aufgabenstellung des Krawattenrätsels ab (dort haben je zwei Kugeln dieselbe Nummer), die Problemstellung wird dadurch aber nicht verändert. Zur übersichtlicheren Beschreibung des Algorithmus, wird jeder Topf in zwei Hälften oben (o) und unten (u) unterteilt, in denen je eine Kugel liegt. Eine Vertauschung wird durch zwei Tupel der Form (i, o/u) (i + 1, o/u) angegeben. Dabei wird die obere/untere Kugel aus Topf i mit der oberen/unteren Kugel aus Topf i + 1 getauscht. Die abkürzende Schreibweise i o/u j bedeutet, dass die obere (bzw. untere) Kugel aus Topf i entlang der oberen (unteren) Reihe bis Topf j geschoben wird. Dabei werden j i Operationen benötigt. An einigen Stellen wird die Operation flip(i,j) benutzt. Dabei werden in den Töpfen i bis j die oberen mit den unteren Kugeln vertauscht. Diese Operation wird nicht als Vertauschung gezählt, da es eigentlich unerheblich ist, ob eine Kugel oben oder unten liegt. Es dient lediglich der übersichtlicheren Notation. Freie Universität Berlin, Institut für Mathematik und Informatik unterstützt durch das DFG Forschungszentrum Matheon Mathematik für Schlüsseltechnologien <kaelberer,nieser,reitebuch>@mi.fu-berlin.de 1

2 Der Algorithmus Der Algorithmus besteht aus einer Hauptmethode krawattenloeser(n) und einer rekursiven Methode invert(n). Die Hauptmethode invertiert die Reihenfolge der Kugeln in den 2n Töpfen. Dabei wird die rekursive Methode aufgerufen, die ein jeweiliges Teilproblem löst. Die genaue Funktionsweise der Methoden werden in den Sektionen 3 und 4 erklärt. Der Pseudocode der Methoden ist wie folgt: Algorithm 1 Krawattenlöser(n) 1: if n == 1 then 2: return 3: end if 4: Tausche 0 u n 1 5: Call invert(n 1) Algorithm 2 invert(k) für gerade k 1: Tausche (0, o) (1, u) 2: Tausche 1 u k 1 3: Tausche (k 1, u) (k, o) 4: for j = 1 to k/2 1 do 5: Tausche (j, o) (j + 1, u) 6: Tausche j + 1 u k j 7: end for 8: flip(0, k 1) 9: Call invert(k/2) 10: flip(0, k/2) 11: for j = 0 to k/2 2 do 12: Tausche k/2 j u k 1 2j 13: Tausche (k/2 j 1, o) (k/2 j, u) 14: Tausche k/2 j u k 2 2j 15: end for 3 Krawattenlöser Zu Beginn seien die Kugeln in den n Töpfen seien wie folgt verteilt: Ein Aufruf der Methode krawattenloeser(n) macht daraus: 2

Algorithm 3 invert(k) für ungerade k 1: if k == 1 then 2: Tausche (0, o) (1, o) 3: return 4: end if 5: Tausche (0, o) (1, u) 6: Tausche 1 u k 1 7: Tausche (k 1, u) (k, o) 8: for j = 1 to (k 1)/2 do 9: Tausche (j, o) (j + 1, u) 10: Tausche j + 1 u k j 11: end for 12: flip(0, k 1) 13: Call invert((k 1)/2) 14: for j = 0 to (k 3)/2 do 15: Tausche ((k 1)/2 j, o) ((k 1)/2 j + 1, u) 16: Tausche (k 1)/2 j + 1 u k 1 2j 17: Tausche (k 1)/2 j 1 u k 2 2j 18: end for 19: flip(0, 0) Zeilen 1 3 : Behandelt den Spezialfall für n = 1. Zeile 4 : Schiebt die Kugel 2n 1 entlang der unteren Reihe in Topf n 1 (benötigt n 1 viele Vertauschungen): Zeile 5 : Ruft die rekursive Methode invert(n 1) auf, die die Kugeln in den Töpfen 0 bis n 2, sowie die obere Kugel in Topf n 1 richtig einsortiert (siehe Sektion 4). 4 Die Methode invert(k) Der eigentliche Teil des Krawattenlösers besteht aus der rekursiven Methode invert(k). Sie operiert nur auf den Kugeln in den Töpfen 0 bis k 1, sowie auf der oberen Kugel in Topf k. Sei die Konfiguration bei Aufruf der Methode wie folgt: 3

Die Methode macht daraus: Die Methode unterscheidet sich für gerade und ungerade k. Die Funktionsweise der zwei Algorithmen wird in den folgenden Sektionen beschrieben. 4.1 invert(k) für gerade k Zeilen 1 3 : Schiebt Kugel 2k entlang der unteren Reihe an ihre endgültige Position in Topf k. Dabei werden k Vertauschungen benötigt. Zeilen 4 7 : Alle anderen oberen Kugeln aus den Töpfen 1 bis k/2 1 werden nun nacheinander entlang der unteren Reihe an ihre Endposition (Töpfe k 1 bis k/2+1) geschoben. Zunächst einmal Kugel 2k 2: Dafür werden k 2 Vertauschungen benötigt. Dann Kugel 2k 4 (k 4 Vertauschungen), usw. Die Kugel k + 2 wird als letzte in dieser Schleife um 2 Plätze nach rechts getauscht. Danach sieht die Verteilung folgendermassen aus: Die Anzahl der Vertauschungen in den Zeilen 7 10 ist: k/2 1 (k 2i) = 1 4 k2 1 2 k. i=1 Zeile 8 : Die oberen und unteren Kugeln werden in den Töpfen 0 bis k 1 vertauscht. Dies zählt nicht als Vertauschungs-Operation, da die Kugeln innerhalb eines Topfes gleichberechtigt sind und für den Algorithmus nicht vertauscht werden müssen. Das passiert hier nur, um den rekursiven Aufruf einfacher beschreiben zu können. 4

Zeile 9 : Ruft die Methode rekursiv auf. Dabei werden die Kugeln in den Töpfen 0 bis k/2 1, sowie die obere Kugel aus Topf k/2 in der Reihenfolge umgekehrt. Zeile 10 : Vertauscht die oberen und unteren Kugeln aus den Töpfen 1 bis k/2. Zeilen 11 15 : In dieser Schleife werden nun nacheinander die Kugeln 2k 1,2k 3,...,5 entlang der unteren Reihe an ihre finalen Positionen geschoben. Zunächst einmal Kugel 2k 1 (benötigt k/2 1 Vertauschungen). Dann Kugel 2k 3 (k/2 1 Vertauschungen): Die Kugeln 2k bis 2k 4 sind nun an ihrer richtigen Endposition. Die linken k 2 Töpfe zusammen mit der oberen Kugel aus Topf k 2 bilden genau dieselbe Konfiguration wie die Situation nach Zeile 10, nur dass k jetzt um 2 kleiner geworden ist. Wenn also die Zeilen 12 14 in der Schleife ausgeführt werden, werden nach und nach alle Kugeln an ihre richtige Position einsortiert. Als letztes wird Kugel 5 mit einem Vertauschungsschritt gegen die 2 getauscht werden. Danach sind alle Kugeln aufsteigend sortiert. Die Anzahl der Vertauschungen der gesamten Schleife ist: k/2 2 i=0 (( ) ( )) 1 1 2 k 1 i + 2 k 1 i = 1 4 k2 1 2 k 5

4.2 invert(k) für ungerade k Zeilen 1 4 : Behandelt den Spezialfall für k = 1, um die Rekursion zu beenden. Zeilen 5 11 : Genauso wie für ungerade k. Die oberen Kugeln aus den Töpfen 0 bis (k 1)/2 werden entlang der unteren Reihe in die Töpfe k bis (k + 1)/2 geschoben. Als letztes wird Kugel k + 1 mit einer Vertauschung in Topf (k + 1)/2 getauscht. Die Anzahl der Vertauschungen in den Zeilen 5 11 ist: (k 1)/2 i=0 (k 2i) = 1 4 k2 + 1 2 k + 1 4. Zeile 12 : Vertauscht obere und untere Kugeln in den Töpfen 0 bis k 1. Zeile 13 : Rekursiver Aufruf des Algorithmus auf die linken (k 1)/2 Töpfe (sowie die obere Kugel aus Topf (k 1)/2). Zeilen 14 18 : Es werden nacheinander die Kugeln 2k 1,2k 3,...,3 entlang der unteren Reihe an ihre finalen Positionen geschoben. Zunächst einmal Kugel 2k 1 (benötigt (k 1)/2 Vertauschungen). Dann Kugel 2k 3 ((k 3)/2 Vertauschungen): 6

Die Kugeln 2k bis 2k 4 sind nun an ihrer richtigen Endposition. Die linken k 2 Töpfe zusammen mit der oberen Kugel aus Topf k 2 bilden genau dieselbe Konfiguration wie die Situation nach Zeile 13, nur dass k jetzt um 2 kleiner geworden ist. Wenn also die Zeilen 14 18 in der Schleife ausgeführt werden, werden nach und nach alle Kugeln an ihre richtige Position einsortiert. Als letztes wird Kugel 3 in Topf 0 mit einem Vertauschungsschritt gegen Kugel 0 in Topf 1 getauscht werden. Die Anzahl der Vertauschungen der gesamten Schleife ist: (k 3)/2 i=0 (( k 1 Zeile 19 : Vertauscht obere und untere Kugel in Topf 0. 5 Aufwandsberechnung 2 ) ( )) k 1 i + i = 1 2 4 k2 1 4. Zählt man die Vertauschungen aus Sektion 4 zusammen, erhält man den Gesamtaufwand der invert-methode: für gerade k : für ungerade k : i(k) = 1 2 k2 + i ( ) k. (1) 2 i(k) = 1 2 k2 + 1 ( ) k 1 2 k + i. (2) 2 Der Aufwand des Krawattenlösers berechnet sich nun wie folgt: Fall 1: n = 2 j + 1, j N In diesem Fall wird die Methode invert(k = 2 j ) aufgerufen. Für alle rekursiven Aufrufe ist k somit gerade. Durch vollständige Induktion nach der Rekursionsformel (1) kann die folgende Gleichung für den Aufwand leicht verifiziert werden: i(k) = 2 3 k2 + 1 3. Somit benötigt der Krawattelöser die folgende Anzahl an Vertauschungen: k(n) = n 1 + i(n 1) = 2 3 n2 1 3 n Er kommt also an die theoretische untere Schranke und ist somit optimal. 7

Fall 2: n beliebig Für beliebige n ist der Algorithmus nicht unbedingt optimal. Es lässt sich aus den Formeln (1) und (2) per vollständiger Induktion folgern: i(k) 2 3 k2 + 1 3 k. Der Krawattelöser benötigt also maximal viele Vertauschungen. k(n) = n 1 + i(n 1) 2 3 n2 2 3 8