350 likes | 493 Views
Diskrete Mathematik II. Vorlesung 4 SS 2001. Tiefen- und Breitendurchlauf, geometrische Algorithmen, Segmentschnitt I. Übersicht. Abschluss Graph-Algorithmen Tiefendurchlauf Beispiel rekursiver Algorithmus Breitendurchlauf Beginn Geo-Algorithmen Prüfung auf Schnittfreiheit
E N D
Diskrete Mathematik II Vorlesung 4 SS 2001 Tiefen- und Breitendurchlauf, geometrische Algorithmen, Segmentschnitt I
Übersicht • Abschluss Graph-Algorithmen • Tiefendurchlauf • Beispiel • rekursiver Algorithmus • Breitendurchlauf • Beginn Geo-Algorithmen • Prüfung auf Schnittfreiheit • Heute: Schnitt zweier Segmente • Nächste Woche: Schnitt von n Segmenten Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Was ist neu • In einem binären Baum hat jeder Knoten höchstens zwei Nachfolger, in einem Graphen beliebig viele • Ein Baum ist immer zyklenfrei, ein Graph kann Zyklen enthalten (z.B. Do – Du – D – W im Beispiel) • In einem Zyklus kann man unendlich viel Zeit verbringen • Lösung: Faden der Ariadne (Quelle: Sagen des klassischen Altertums) • Moderne Version: ein Boolescher Array „besucht“ Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf aktuell Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf besucht Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf kein Nachfolger - backtracking Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Alle Nachfolger sind bereits besucht Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Do Du Ha W D K Tiefendurchlauf Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Tiefendurchlauf als rekursiver Algorithmus tiefensuche(k) //Tíefendurchlauf vom Knoten k aus { if(besucht[k] == false) { drucke k; besucht[k] = true; for(jeder Nachfolger ki von k) { tiefensuche(ki); } } } Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Breitendurchlauf (binärer Suchbaum) class BST { ... void Breitendurchlauf() { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(wurzel); while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); ws.FügeAn(aktuell.GibLinks()); ws.FügeAn(aktuell.GibRechts()); } } ... } Test auf Ende entferne Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Breitendurchlauf class BST { ... void Breitendurchlauf(k) { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(k); while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); ws.FügeAn(aktuell.GibLinks()); ws.FügeAn(aktuell.GibRechts()); } } ... } besucht[k] = true; Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Verarbeiten eines Knotens Breitendurchlauf class BST { ... void Breitendurchlauf(k) { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(k); besucht[k] = true; while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); ws.FügeAn(aktuell.GibLinks()); ws.FügeAn(aktuell.GibRechts()); } } ... } Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Breitendurchlauf class BST { ... void Breitendurchlauf(k) { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(k); besucht[k] = true; while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); for(jeder Nachfolger ki von aktuell) { if(besucht[ki] == false) { ws.FügeAn(ki); besucht[ki] = true; } } } } ... } Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Prüfung auf Schnittfreiheit • 1. Idee • Berechnung der Geradengleichungen g und g‘ der Segmente s und s‘ • Schnittpunkt p von g und g‘ • prüfe ob p in s und s‘ Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Schnittpunktberechnung Gegeben: Endpunkte der Segmente Geradengleichung für zwei Punkte: Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Prüfung auf Schnittfreiheit • 1. Idee • Berechnung der Geradengleichungen g und g‘ der Segmente s und s‘ • Schnittpunkt p von g und g‘ • prüfe ob p in s und s‘ • Problem • vertikale Segmente • Vermeidung unangenehmer Sonderfälle Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
g1 g2 g1 g2 g2 g1 c) b) a) Segmentschnitt I Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
y D = 0 D > 0 P2 P s D < 0 P1 x Segmentschnitt II • Reduktion auf das Problem: P1, P2 liegen auf der gleichen / verschiedenen Seiten der durch g induzierten Geraden • Homogene Koordinaten:P1 = (x1,y1,w1)P2 = (x2,y2,w2)P = (x,y,w) • w = w1 = w2 = 1 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Z x Y y X Was wird durch die Determinante berechnet? Vektoren spannen Parallelepiped auf P2 P P1 1 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Spatprodukt Das Spatprodukt ergibt einen Skalar, der zahlenmäßig gleich dem Volumen des von den drei Vektoren gebildeten Parallelepipeds ist; das Ergebnis ist positiv, falls , und ein Rechtssystem, negativ, falls sie ein Linkssystem bilden. Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Bilden ein Rechtssystem Z x Y P2 P P1 1 y X Rechts- oder Linkssystem? Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Z bilden ein Rechtssystem x Y P2 P P1 1 y X Rechts- oder Linkssystem? D > 0 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Z x Y P1 P P2 1 y X Rechts- oder Linkssystem? Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Z bilden ein Linkssystem x Y P1 P P2 1 y X Rechts- oder Linkssystem? D < 0 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Z x Y P1 P P2 1 y X Rechts- oder Linkssystem? Es wird kein Parallelepiped aufgespannt D = 0 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
P2 P2 P3 P2 P3 P4 P1 g P4 P4 g` P1 P1 P3 Einfacher Segmentschnitt I S1 = det ( P1,P3,P4) Def.: Vor.: Alle Determinanten sind 0: S2 = det ( P2,P3,P4) g und g` schneiden sich genau dann, wenn S1, S2 S3 = det ( P3,P1,P2) sowie S3, S4jeweils verschiedene Vorzeichen S4 = det ( P4,P1,P2) haben. Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
Einfacher Segmentschnitt II Wenn alle Determinanten gleich Null sind, dann folgt daraus, daß alle vier Punkte kollinear sind. - eine Determinante ist Null: => Algorithmus: Einsparen von Multiplikationen Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4