This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Modul: Programmierung B-PRG Grundlagen der Programmierung 1 – Teil 2
Softwaretechnik
Prof. Dr. O. DrobnikProfessur Architektur und Betrieb verteilter SystemeInstitut für InformatikFachbereich Informatik und Mathematik
Softwaretechnik
Kapitel 2 – Entwurf von Algorithmen
Grundlagen der Programmierung 1
2.1 Greedy-Methode2.2 Divide and Conquer – Methode2.3 Backtracking-Methode2.4 Schrittweise Verfeinerung
2.2 Divide and Conquer – Methode2.2.1 Methode2.2.2 Maximum-Contiguous-Subvector Problem2.2.3 Naiver Ansatz2.2.4 Divide and Conquer Ansatz für MCS-Problem2.2.5 Scanning-Algorithmus2.2.6 Türme von Hanoi
2.3 Backtracking-Methode2.3.1 Methode2.3.2 Konvexe Hülle: Graham Scan
2.1.1 MethodeStufenweises VorgehenSukzessives Betrachten der EingabewerteAuswahlfunktion: Reihenfolge für die Betrachtung der EingabewerteEntscheidung: gehört Eingabewert zur Lösung oder nichtEinfache Entwurfsmethode, auf vielfältige Problemstellungen anwendbar
Gegeben ist eine Punktmenge von N Punkten in der Ebene. Gesucht sei die konvexe Hülle der Punktemenge, d. h. das kleinste konvexe Polygon, das alle Punkte der Menge enthält.Konvexe Hülle: Jede Strecke, die zwei Punkte innerhalb des Polygons verbindet, muss vollständig innerhalb des Polygons liegen.
Package Wrapping ist der “natürlichste” Algorithmus: er ähnelt der Vorgehensweise des Menschen, eine konvexe Hülle zu zeichnen:
Man wähle einen geeigneten Startpunkt, der garantiert auf der Hülle liegt,nehme einen horizontalen Strahl und bewege ihn solange im Gegenuhrzeigersinn, bis ein weiterer Punkt getroffen wird; dieser Punkt muss auf der Hülle sein;wiederhole die Prozedur von diesem neuen Punkt aus usw. bis letztlich der Startpunkt wieder erreicht wird, d. h. die Punktemenge vollständig “eingehüllt”ist.
Ө wird nur zum Sortieren benötigt.Es genügt daher eine leicht zu berechnende Funktion, deren Anordnungseigenschaft der einer Winkelfunktion äquivalent ist.
Teile das Problem der Größe N in (wenigstens) zwei annähernd gleichgroße Teilprobleme, wenn N > 1 ist.Ist ein Teilproblem hinreichend klein (z.B. N = 1), so löse es direkt und breche so die Rekursion im Lösungsschema ab.
Herrsche (Conquer)Löse die Teilprobleme auf dieselbe Art.
Vereinige (Merge)Füge die Lösungen für die Teilprobleme zur Gesamtlösung zusammen.
Die Anweisungen innerhalb der äußeren Schleifewerden N-mal, die innerhalb der zweiten Schleife jeweilshöchstens N-mal bei jeder Ausführung der äußerenSchleife durchlaufen, dh. die Laufzeit ist in derGrößenordnung von N2.
Teilt man eine gegebene Folge in der Mitte, so liegt die maximale Teilfolge
entweder ganz in einem der beiden Teilstücke
oder sie umfasst die Trennstelle, liegt also teils im linken undteils im rechten Teil.
Für das in einem Teil liegende Stück der maximalen Teilfolge gilt: Die Summe der Elemente ist maximal unter allen zusammenhängenden Teilfolgen in diesem Teil, die das Randelement an der Trennstelle enthalten.
Scanning-PrinzipProbleme auf Folgen (arrays) können oft dadurch gelöst werden, daß man – ausgehend von einer Lösung für v[0 · · · i − 1] – untersucht, wie man diese für v[0 · · · i] erweitern kann.
AnsatzSpeicherung des bereits gefundenen Ergebnisses Hinzunahme von Hilfsdaten zur Berechnung des neuen Resultats
Wir durchlaufen sequentiell die Positionen von v in der Ordnung der Positionen, d. h. 0, 1, · · · , len(v) − 1 MaxSoFar: bereits gefundene maximale TeilsummeWir führen eine neue Variable ein (“Hilfsdaten”): MaxEndingHere
n Steine unterschiedlichen Durchmessers sollen von einem Stapel auf einen anderen gebracht werden, wobei ein Hilfsstapel benutztwerden darf (Problem der Größe n). Dabei sind folgende Bedingungen einzuhalten:
es darf stets nur ein Stein, und zwar der oberste eines Stapels,bewegt werden,zu keiner Zeit darf ein Stein auf einem kleineren liegen.
Vorbedingung: alle Steine mit Nummer x, x + 1, · · · , n auf Stapel i.Nachbedingung: alle Steine mit Nummer x, x + 1, · · · , n auf Stapel j.Umsetzen eines Steines von Stapel i auf j:
Auf Stapel i und j dürfen sich nur größere Steine als der zu bewegende Stein befinden.Alle kleineren Steine müssen deshalb zu diesem Zeitpunkt auf dem dritten Stapel k liegen.
Formal:Wenn für i, j {1, 2, 3} Stein x von Stapel i auf Stapel j gebracht wird, müssen alle kleineren Steine auf dem Stapel mit der Nummer k = 6 − (i + j) liegen.
Aufspaltung des Gesamtproblems:alle Steine x + 1, · · · , n auf Stapel k = 6 − (i + j)Stein x von i auf jalle Steine x + 1, · · · , n von k = 6 − (i + j) auf Stapel j
Aufspaltung führt zur Rekursion: die zu lösenden Teilprobleme sind identisch mit der ursprünglichen Aufgabe, werden aber für eine kleinere Eingabe gelöst.
Das Türme-von-Hanoi Problem demonstriert die Eleganz und Kürze rekursiver Lösungsansätze.
hanoi(3,1,1,2)#Ausgabe:# hanoi(3,1,1,2)# hanoi(3,2,1,3)# hanoi(3,3,1,2)# Scheibe 3 von 1 auf 2# Scheibe 2 von 1 auf 3# hanoi(3,3,2,3)# Scheibe 3 von 2 auf 3# Scheibe 1 von 1 auf 2# hanoi(3,2,3,2)# hanoi(3,3,3,1)# Scheibe 3 von 3 auf 1# Scheibe 2 von 3 auf 2# hanoi(3,3,1,2)# Scheibe 3 von 1 auf 2
2.3.1 MethodeVersuch-und-Irrtum-Prinzip (trial and error):
Auswahl eines möglichen LösungswegsVerfolgen dieses Lösungswegs soweit wie möglichFalls Lösungsweg nicht fortgesetzt werden kann, ersetzen der letzten Entscheidung durch eine AlternativeGgf. iteriertes Rücksetzen der Entscheidungen
Unterschied zu Greedy:Greedy: exhaustives Verfahren – untersucht alle LösungswegeBacktracking: versucht, offensichtlich falsche Lösungswege frühzeitig zu vermeiden (nicht weiter zu verfolgen)
Sortiere Punkte so, dass die Hüllenpunkte in derReihenfolge vorliegen, die man beim Durchlaufen derkonvexen Hülle im Gegenuhrzeigersinn erhält.
Ankerpunkt: kleinste y-Koordinate, größte x-KoordinateSortierung: theta-Funktion (siehe 2.1.2)Man erhält durch die Sortierung der Punkte einenPolygonzug, der alle Punkte umfasst und sich selbstnicht schneidet
Die ersten beiden Punkte liegen auf der Hülle. sukzessive hinzufügen aller Punkte:Bei jedem Punkt prüfen, ob seine Vorgänger tatsächlich auf der konvexen Hülle liegen.
Drehung im UhrzeigersinnProblem: dx1 oder dx2 = 0daher ProduktbildungProblem: Kollinearität der Punkte, d.h. Steigungen sind gleich.Lösung: Funktion ccw wird dreiwertig definiert. Sind P0, P1, P2 kollinear, dann: