AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Graphen in XML darstellen?

Ein Thema von jfheins · begonnen am 26. Aug 2009 · letzter Beitrag vom 26. Aug 2009
Antwort Antwort
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#1

Graphen in XML darstellen?

  Alt 26. Aug 2009, 21:57
Hallo,
ich möchte gerne einen Graphen in einer XML-Datei darstellen (abspeiochern und laden bekomm ich noch hin)

Frage ist jetzt: Wie geht das am effizientesten?

im Moment haben wir node-Elemente, die eine id haben und edge-Elemente, die 2 Node-id's haben. Es werden erst alle Nodes eingelesen und dann die Edges, wobei jede Ecke beim einlesen beide Nodes sucht, um die id zu einer Referenz aufzulösen.

Da das auch mal ein paar mehr Zeiler werden könnten, soll es aber möglichst effizient sein. Jeden Knoten zweimal mit seiner id zu suchen, halte ich nicht für effizient.

Erster Gedanke war, die Nodes beim einlesen in ein Dictionary<id, GraphNode> zu packen, Zugriffe auf ein Dictionary sollten iirc O(1) sein.

Bessere Ideen?

Die XML-Struktur kann auch noch verändert werden, falls das dann besser geht.

P.S.: Es handelt sich um einen gerichteten, zyklenfrien Graphen ohne Mehrfachkanten.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Graphen in XML darstellen?

  Alt 26. Aug 2009, 22:28
Eine weitere Möglichkeit wäre, den Knoten Unterelemente <edge to=".." /> zu geben. Wenn das ganze azyklisch ist, kannst du es dir auch einfach machen und den Graphen falsch herum in die XML-Datei schreiben, die Nodes aufsteigenend nummerieren und in eine Liste packen. Wenn es allerdings garantiert immer gerichtet, azyklisch und einfachbekantet ist, schachtele die Nodes doch einfach.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: Graphen in XML darstellen?

  Alt 26. Aug 2009, 22:37
Es ist zwar garantiert immer azyklisch, gerichtet und einfachbekantet, aber es kann durchaus mehrere Wege von A nach B geben

Also sowas:

Code:
* D
  ^^
 /  \
B  C
^   ^
 \ /
  A
kann durchaus vorkommen.

Wenn ich den Knoten ein edgeto element gebe, muss ich auch wieder suchen. Und suchen könnte langsam sein...
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Graphen in XML darstellen?

  Alt 26. Aug 2009, 22:44
Ok, ich dachte, jede Knoten hätte nur eine Eingangskante - das würde das schön einfach machen, offensichtlich Auf jeden Fall wirst du irgend eine Art des Lookups brauchen, um die Knoten wieder zu finden. Wenn die Knoten selbst durch klassen repräsentiert werden, ist das auch gar kein Problem - die Klasse selbst ist viel schwerer als ein Zeiger darauf, also tun vier(acht) Byte extra für einen Listeneintrag nicht weh.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

Re: Graphen in XML darstellen?

  Alt 26. Aug 2009, 23:19
da du selber Referenzen verwendest, aber in XML einen Index nutzt, wirst immer suchen müssen.

zum Optimieren:

du könntest wärend des Ladens ein(e) Array/Liste führen, wo du die erstellten Punte und ihren Index speicherst, zum schnellerem Suchen.

B und C könnten als Unterknoten von A gespeichert sein, dann muß man da nicht mehr suchen
D als Unterknoten von B = ebenfalls kein suchen
in C kommt ein to="D", da D ja schon in B drin ist
oder ein to="A.B.D", samt schnellem Suchpfad
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

Re: Graphen in XML darstellen?

  Alt 26. Aug 2009, 23:57
Ich würde in die XML-Datei zwei Haupt-Nodes einfügen: eine Liste der einzelnen Knoten und eine Liste der Kanten.
Beim Abspeichern der Knoten bekommt jeder Punkt einen Index, der temporär im Knoten abgelegt wird. Beim Speichern der Kanten werden die Knoten-Indizes geschrieben.
Bei Einlesen werden zunächst alle Knoten der Reihe nach in ein Array geschrieben. Damit kann beim Einlesen der Kanten jeder Knoten über seinen Index mit O(1) gefunden werden.

Nur so ein Gedanke...
Uwe Raabe
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz