Kann mir jemand auf die richtigen Datenstrukturen/Algorithmen hinweisen, um folgendes zu erreichen?Vereinigung von zwei Netzwerkdiagrammen
Ich möchte (Union?) Die folgenden zwei Sätze von Knoten kombinieren, um den dritten Satz zu erhalten.
Danke!
Kann mir jemand auf die richtigen Datenstrukturen/Algorithmen hinweisen, um folgendes zu erreichen?Vereinigung von zwei Netzwerkdiagrammen
Ich möchte (Union?) Die folgenden zwei Sätze von Knoten kombinieren, um den dritten Satz zu erhalten.
Danke!
Ich nehme es eine Graphdatenstruktur verwenden, in denen es Node
Fällen, in denen jeder Node
eine string Name
und eine list<Node> Next
.
Nennen wir Ihre beiden Graphen G
und H
, wobei ein Graph eine list<Node>
ist.
Lassen Sie GNames
und HNames
die Sätze der Knotennamen in jedem der Graphen sein. Lassen Sie MNames
die Union von GNames
und HNames
sein.
Erstellen Sie ein neues Diagramm list<Node> M
, wo es einen neuen Node
für jeden Namen in MNames
gibt.
Build map<string, Node> GLookup, HLookup, MLookup
als Zuordnungen von Knotenname zu Node
für jede der list<Node> G, H, M
.
Für jeden Node u
in diesem neuen Graphen M
berechnen NextNames
als die Vereinigung von GLookup[u.Name].Next.Select(v => v.Name)
und HLookup[u.Name].Next.Select(v => v.Name)
, dann für jeden Namen name
in NextNames
, fügen MLookup[name]
-u.Next
.
M
ist jetzt Ihr zusammengeführter Graph.
list<Node> merge(list<Node> G, list<Node> H)
GNames = G.Select(u => u.Name)
HNames = H.Select(u => u.Name)
MNames = union(GNames, HNames)
M = MNames.Select(name => new Node(name))
GLookup = G.ToMap(u => u.Name)
HLookup = H.ToMap(u => u.Name)
MLookup = M.ToMap(u => u.Name)
foreach u in M
NextNames = union(
GLookup[u.Name].Next.Select(v => v.Name),
HLookup[u.Name].Next.Select(v => v.Name))
foreach name in NextNames
u.Next.Add(MLookup[name])
return M
Typischerweise Graphen können entweder als Adjazenzmatrizen oder Adjazenzlisten dargestellt werden. So oder so, um sie zu vereinigen, ist nicht schwer.
Aus der Sicht Adjazenzliste Sie
list1 = [[A,[B,K]],[B,[C,D,E]],...]
list2 = [[A,[B]],[B,[C,D,E]],...]
haben so alles, was Sie tun müssen, würde ist die Vereinigung der Unterliste pro Knoten in Ihrer Adjazenzlisten
list3 = [[A,UNION([B,K],[B])]...]
Für die Adjazenzmatrix ist es trivial. Einfach eine Schleife durch jede Aij in der Matrix, und wenn es 0 ist, und der entsprechende Eintrag in der anderen Matrix gleich 1 ist, auf 1 setzen
Wenn Grafik 1 etwas wie hatte:
A B C
A 1 1 0
B 0 1 0
C 0 1 1
und Graph
2 hatte so etwas wie:A B C
A 1 1 0
B 0 1 1
C 0 0 1
dann graph 3 würde sich mit
A B C
A 1 1 0
B 0 1 1
C 0 1 1
Dies ist auf jeden Fall richtig, aber das ist eher eine mathematische Operation als eine Datenstruktur Betrieb. Um dies zu implementieren, ist eine gewisse Arbeit erforderlich, abhängig davon, wie der Graph dargestellt wird. – templatetypedef
@templatetypedef Ich erweiterte für den Fall einer Knoten-Klasse-basierten Grafikdarstellung. –
Danke ... zuerst mochte ich nicht die Kürze der kurzen Antwort ... aber dann dachte ich 30 Sekunden lang darüber nach und bekam es! :) –