Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Wilhelmine Wurl Geändert vor über 10 Jahren
1
Zeichnen von Bäumen Seminar Graphenzeichnen SS03 von Lina Wolf
2
Zeichnen von Bäumen 1. Was ist ein Baum? 2. Generelle Wünsche 3. Ästhetische Regeln 4. Geschichtete Zeichnungen 5. Andere Algorithmen
3
Was ist ein Baum? Baum wie üblich definiert m-ärer Baum: max m Kinder Kinder ev. geordnet Kind von Binärbaum links oder rechts freier Baum:ohne Wurzel
4
Generelle Wünsche Planar Gitter gerade Linien (streng) aufsteigend erhaltene Ordnung aufgeräumt
5
Ästhetische Regeln nach Tilford und Reingold 1. Knoten gleicher Höhe auf gerader Linie, diese parallel 2. Linkes Kind links von Mutter und re 3. Mutter zentriert über Kindern 4. Isomorphismus, gleiche Teilbäume gleich
6
1. Ästhetische Regel Knoten gleicher Höhe auf gerade Linie, diese parallel geschichtete Zeichnungen: Knoten.y = Knoten.Tiefe Algorithmen nur für X-Koordinaten
7
2. Ästhetische Regel Linkes Kind links von Mutter und re nur in geordneten Binärbäumen (m>2)-ären Bäumen: 1 Kind direkt unter Mutter
8
3. Ästhetische Regel Mutter zentriert über Kindern
9
4. Ästhetische Regel Isomorphismus, gleiche Teilbäume gleich
10
Geschichtete Zeichnungen Knoten.y = Knoten.Tiefe firstWalk Verschiebung Teilbaum nur seiner Wurzel gespeichert. secondWalk:Verschiebungen aufsummiert
11
secondWalk secondWalk(knoten, level, sum){ knoten.x = knoten.x + sum; knoten.y = level; für(alleKinder){ secondWalk(kind, level+1, sum + knoten.verschiebung); }
12
Geschichtete Zeichnungen Algorithmus WS verbesserter WS Algorithmus TR Algorithmus von Walker verbesserter Walker
13
Algorithmus WS Wetherell and Shannon firstWalk(knoten, level) für (alleKnoten(post-Order)){ wenn(Knoten hat n Kinder){ n == 0: Knoten.x nächsteX(level); n == 1: Knoten.x r/l Mutter n == 2: zentriere Knoten ü. Kinder } wenn (Knoten.x < nächsteX(level)){ Knoten.x nächsteX(level) Kinder(Teilbäume) schiften }}
14
Algorithmus WS Wetherell und Shannon Achtung: Ästhetische Regel 4 (Isomorphismus) wird nicht beachtet. Platz verschenkt
15
veränderter WS Wetherell und Shanon präsentieren veränderten Algorithmus (l) Mutter nicht mehr über Kindern zentriert.
16
Algorithmus TR Tilford und Reingold Alle vier ästhetischen Regeln beachtet
17
Algorithmus TR Tilford und Reingold Laufzeit O(n) beide Teilbäume unabhängig fertig, nur noch verschieben Wurzeln nebeneinander plaziert auseinander schieben bis kein Knoten mehr berührt
18
Algorithmus TR Tilford und Reingold Problem: wie Rändern folgen? Der linken Kante zu folgen reicht nicht aus: Idee: nächster Knoten Kind von diesem oder dieser Blatt. Bei Blatt Pointer auf nächsten Knoten
19
Algorithmus TR Für m-äre Bäume Links/rechts klebendes Problem
20
Algorithmus TR Für m-äre Bäume, Spiegelung
21
Algorithmus von Walker Verbesserung TR Unterbäume gut verteilt Laufzeit immer noch O(n) laut Walker(!!!)
22
Algorithmus Walker
23
firstWalk Alg. Walker void firstWalk(knoten, level){ knoten.x = 0; wenn(knoten.hatLSchw()){ knoten.x = knoten.lSchw.x + DIS; } wenn(!knoten.istBlatt()){ für(alleKinder){ firstWalk(kind, level + 1); }
24
firstWalk Alg. Walker m =(lKind.x + rKind.x)/2; wenn(knoten.hatLSchw()){ knoten.verschiebung = knoten.x - m; apportion(knoten, level); } sonst { // knoten linkestes Kind knoten.x = m; //zentriert ü. Kindern }
25
Apportion Alg. Walker Apportion(..) verhindert links/ rechts kleben. zwischen linker und rechter Teilbaum Bäume gleichmäßig verteilt Wird für jeden Knoten aufgerufen Aber Laufzeit Apportion nicht konstant => Laufzeit Walker O(n 2/3 )
26
Apportion Alg. Walker void apportion(knoten, level){ eins = knoten.erstesKind(); nachbar = linkerNachbar(eins); tiefe = 1; solange(eins != ø && nachbar != ø){ rPosi = eins.posi(tiefe); lPosi = nachbar.posi(tiefe); vNachbar = nachbar.Vorfahr(tiefe); abstand = rPosi + TB_TRENN - lPosi; wenn(abstand > 0){ nrSchw = knoten.nrLSchw(vNachbar);
27
Apportion Alg. Walker wenn(knoten.hatSchw(vNachbar)){ teil = abstand / nrSchw; für(alle Schwestern bis vNachbar){ schwester.x += abstand; schwester.verschiebung += abstand abstand = abstand-teil; }}} wenn(eins.istBlatt()){ eins = knoten.holLinkestes(knoten, 0, tiefe); } sonst { eins = erstes.erstesKind(); } nachbar = linkerNachbar(eins); //fehlt bei //Walker, macht sonst keinen Sinn }}
28
Apportion knoten erstes nachbar vNachbar Tiefe = 1 abstand > 0
29
Apportion knoten vNachbar erstesnachbar Tiefe = 2 abstand > 0
30
Apportion knoten vNachbar erstesnachbar Tiefe = 3 abstand = 0
31
Apportion knoten vNachbar erstesnachbar Tiefe = 4 abstand = 0
32
Apportion knoten vNachbar erstesnachbar Tiefe = 5 Ø Fertig!
33
Verbesserter Walker O(n) Buchheim, Jünger und Leipert weisen nach, dass Walker in worst- case (n 2/3 ) schlagen anderen Algorithmus vor, verändertes apportion
34
Verändertes Apportion Rändern folgen: wie R und T (Pointer) Vorfahren finden: rechter bekannt, linker nach Schieber und Vishkin O(1) Teilbäume zählen: rechter - linker +1 alle Teilbäume in weiterer Traversierung verschieben => Apportion konstant
35
Laufzeit linearer Walker
36
Andere Algorithmen Radiale Zeichnungen HV-Zeichnungen rechtsschwere HV- Zeichnungen
37
Radiale Zeichnungen Häufig für freie Bäume Algorithmen ähnlich geschichtete
38
Radiale Zeichnungen Teilbäume beschränkt auf konvexe Ausschnitte sonst nicht planar Tangente durch Knoten Teilbaum zwischen a und b
39
HV-Zeichnungen
40
HV = horizontal-vertical Nur für Binärbaume, unterstützt Gitterzeichnung Ordnung kann erhalten bleiben die die Teilbäume umgebenen Rechtecke schneiden sich nicht
41
HV-Algorithmus Divide: Rekursiv linken und rechten Teilbaum konstruieren Conquer: horizontale (a) oder vertikale (b) Kombination
42
Ordnung nicht erhalten Höhe max log(n) Conquer: mit horizontaler Kombination größerer Teilbaum rechts von anderem rechtsschwere HV- Zeichnungen
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.