Zeichnen von Bäumen Seminar Graphenzeichnen SS03 von Lina Wolf.

Post on 05-Apr-2015

113 views 3 download

Transcript of Zeichnen von Bäumen Seminar Graphenzeichnen SS03 von Lina Wolf.

Zeichnen von BäumenSeminar Graphenzeichnen SS03von Lina Wolf

Zeichnen von Bäumen

1. Was ist ein Baum?2. Generelle Wünsche3. Ästhetische Regeln4. Geschichtete Zeichnungen5. Andere Algorithmen

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

Generelle Wünsche•Planar•Gitter•gerade Linien•(streng) aufsteigend •erhaltene Ordnung•aufgeräumt

Ästhetische Regelnnach Tilford und Reingold

1. Knoten gleicher Höhe auf gerader Linie, diese parallel2. Linkes Kind links von Mutter und re3. Mutter zentriert über Kindern4. Isomorphismus, gleiche Teilbäume gleich

1. Ästhetische RegelKnoten gleicher Höhe auf gerade Linie, diese parallel

geschichtete Zeichnungen: Knoten.y = Knoten.Tiefe Algorithmen nur für X-Koordinaten

2. Ästhetische RegelLinkes Kind links von Mutter und re

nur in geordneten Binärbäumen

(m>2)-ären Bäumen: 1 Kind direkt unter Mutter

3. Ästhetische RegelMutter zentriert über Kindern

4. Ästhetische RegelIsomorphismus, gleiche Teilbäume gleich

Geschichtete Zeichnungen•Knoten.y = Knoten.Tiefe•firstWalk•Verschiebung Teilbaum nur seiner Wurzel gespeichert. •secondWalk:Verschiebungen aufsummiert

secondWalksecondWalk(knoten, level, sum){ knoten.x = knoten.x + sum; knoten.y = level; für(alleKinder){ secondWalk(kind, level+1, sum + knoten.verschiebung); }}

Geschichtete Zeichnungen

•Algorithmus WS•verbesserter WS•Algorithmus TR•Algorithmus von Walker•verbesserter Walker

Algorithmus WSWetherell 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}}

Algorithmus WSWetherell und Shannon

Achtung: Ästhetische Regel 4 (Isomorphismus) wird nicht beachtet.

Platz verschenkt

veränderter WS

Wetherell und Shanon präsentieren veränderten Algorithmus (l) Mutter nicht mehr über Kindern zentriert.

Algorithmus TRTilford und Reingold

Alle vier ästhetischen Regeln beachtet

Algorithmus TRTilford 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

Algorithmus TRTilford 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

Algorithmus TRFür m-äre Bäume

Links/rechts klebendes Problem

Algorithmus TRFür m-äre Bäume, Spiegelung

Algorithmus von Walker

•Verbesserung TR •Unterbäume gut verteilt •Laufzeit immer noch O(n)

laut Walker(!!!)

Algorithmus Walker

firstWalk Alg. Walkervoid 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);}

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 }}

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(n2/3)

Apportion Alg. Walkervoid 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);

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}}

Apportion

knoten

erstes

nachbar

vNachbar

Tiefe = 1abstand > 0

Apportion

knotenvNachbar

erstesnachbar

Tiefe = 2abstand > 0

Apportion

knotenvNachbar

erstesnachbar

Tiefe = 3abstand = 0

Apportion

knotenvNachbar

erstesnachbar

Tiefe = 4abstand = 0

Apportion

knotenvNachbar

erstesnachbar

Tiefe = 5

Ø Fertig!

Verbesserter Walker O(n)Buchheim, Jünger und Leipert weisen nach, dass Walker in worst-case (n2/3)schlagen anderen Algorithmus vor, verändertes apportion

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

Laufzeit linearer Walker

Andere Algorithmen

•Radiale Zeichnungen•HV-Zeichnungen•rechtsschwere HV- Zeichnungen

Radiale Zeichnungen

•Häufig für freie Bäume•Algorithmen ähnlich geschichtete

Radiale Zeichnungen•Teilbäume beschränkt auf konvexe Ausschnitte•sonst nicht planar•Tangente durch Knoten Teilbaum zwischen a und b

HV-Zeichnungen

HV-ZeichnungenHV = horizontal-vertical

• Nur für Binärbaume, unterstützt Gitterzeichnung•Ordnung kann erhalten bleiben• die die Teilbäume umgebenen Rechtecke schneiden sich nicht

HV-AlgorithmusDivide: Rekursiv linken und rechten Teilbaum konstruierenConquer: horizontale (a) oder vertikale (b) Kombination

•Ordnung nicht erhalten•Höhe max log(n)•Conquer: mit horizontaler Kombination größerer Teilbaum rechts von anderem

rechtsschwere HV- Zeichnungen