Zirkulare Abhängigkeiten überprüfen
-
Mr.Know-it-all schrieb:
Wenn du deine Datenstruktur anpasst, kannst du sehr schnelle Graph Scanning Algorithmen verwenden, wie z.B. solche die auf Breitensuche basieren, also O(Kanten + Ecken) Laufzeit haben.
das ist ja fein.
wie ist nochmal die komplexität des von mir angegebenen algos? auch O(Kanten+Ecken)? das schien mir so beim einfach mal abschätzen. wo hab ich mich vertan?Dazu sollte der Graph in Adjazenzlisten Form vorliegen.
Details z.B. bei Wikipedia.detailangabe abgelehnt. schon ein wenig genauer, falls du hilfreich helfen willst. und ich widerspreche mal prophylaktisch.
-
volkard, meinst du sowas?
BGL File Dependency Example
-
-
Naja, da stehts doch:
depth-first search
Complexity
The time complexity is O(E + V)Die Boost Adjazenzliste ist einfach zu benutzen.
Und wenn dir BGL nicht gefällt, kannst es ja nachbauen. Ist aber sehr nett generisch aufgebaut.
-
1310-Logik schrieb:
Naja, da stehts doch:
depth-first search
Complexity
The time complexity is O(E + V)Die Boost Adjazenzliste ist einfach zu benutzen.
Und wenn dir BGL nicht gefällt, kannst es ja nachbauen. Ist aber sehr nett generisch aufgebaut.da steht jetzt auch nicht drin, daß man adjazenzlisten nehmen sollte, um O(E+V) zu erreichen.
-
BGL Docu schrieb:
The advantage of this matrix format (adjacency matrix Anm.d.Q.) over the adjacency list is that edge insertion and removal is constant time. There are several disadvantages. The first is that the amount of memory used is O(V2) instead of O(V + E) (where E is the number of edges). The second is that operations that traverse all the out-edges of each vertex (such as breadth-first search) run in O(V2) time instead of O(V + E) time for the adjacency list. In short, it is better to use the adjacency_matrix for dense graphs (where E is close to V2) and it is better to use adjacency_list for sparse graphs (where E is much smaller than V2).
-
1310-Logik schrieb:
BGL Docu schrieb:
The advantage of this matrix format (adjacency matrix Anm.d.Q.) over the adjacency list is that edge insertion and removal is constant time. There are several disadvantages. The first is that the amount of memory used is O(V2) instead of O(V + E) (where E is the number of edges). The second is that operations that traverse all the out-edges of each vertex (such as breadth-first search) run in O(V2) time instead of O(V + E) time for the adjacency list. In short, it is better to use the adjacency_matrix for dense graphs (where E is close to V2) and it is better to use adjacency_list for sparse graphs (where E is much smaller than V2).
immernochnicht steht da, daß man adjazenzlisten nehmen sollte, statt dem ursprünglichen
struct Ding { int num; std::vector<Ding const*> abhaengigvon; };
-
volkard schrieb:
immernochnicht steht da, daß man adjazenzlisten nehmen sollte, statt dem ursprünglichen
struct Ding { int num; std::vector<Ding const*> abhaengigvon; };Was unterscheidet denn dieses Konstrukt von ner Adjazenzliste?
-
1310-Logik schrieb:
Was unterscheidet denn dieses Konstrukt von ner Adjazenzliste?
uups.
gar nichts.
-
volkard schrieb:
1310-Logik schrieb:
Was unterscheidet denn dieses Konstrukt von ner Adjazenzliste?
uups.
gar nichts.Juhuu :p
Nein nur spass!
Die BGL Doku gibt übrigends auch sehr viel über Umsetzung der Graphentheorie in C++ her. Ist wirklich nett zu gebrauchen, und ähnlich aufgebaut wie die STL und die Algorithmen sind optimiert worden. Aber Du bist sicher mehr fürs selberbasteln
-
1310-Logik schrieb:
volkard schrieb:
1310-Logik schrieb:
Was unterscheidet denn dieses Konstrukt von ner Adjazenzliste?
uups.
gar nichts.Juhuu :p
Nein nur spass!
Die BGL Doku gibt übrigends auch sehr viel über Umsetzung der Graphentheorie in C++ her. Ist wirklich nett zu gebrauchen, und ähnlich aufgebaut wie die STL und die Algorithmen sind optimiert worden. Aber Du bist sicher mehr fürs selberbasteln
Wie wärs mit nem Beispiel?

-
phlox81 schrieb:
Wie wärs mit nem Beispiel?


Was meinst Du? Den Link weiter vorne zB?1310-Logik schrieb:
-
1310-Logik schrieb:
phlox81 schrieb:
Wie wärs mit nem Beispiel?


Was meinst Du? Den Link weiter vorne zB?1310-Logik schrieb:
Naja, eher wie man aus
struct Ding { int num; std::vector<Ding const*> abhaengigvon; };so ne Liste macht. Oder hab ich da was falsch verstanden?
Müsste er jetzt für jedes Element von abhaengigvon eine Edge(this,abhaengigvon) erstellen?
-
Aso..
Du haust die Structs einfach in nen Vector, dann hast Du alle Abhängigkeiten von allen Vertices in einem.
Die Adjazenzliste sieht dann so aus:[1] -> [3][5][7][8] [2] -> [4][5][6] [3] -> [1][2][8][9] [4] -> [2][7] //...uswBessere Abbildung auf http://www.tilman.de/uni/ws03/alp/adjazenz.php
-
class Vertex { public: void add_edge( Vertex target ); void remove_edge( Vertex target ); private: Ding& das_ding; std::vector<Vertex*> edges; }; class adjacency_list { public: // Ein paar nette Methoden spendieren void add_vertex( Vertex vert ); void remove_vertex( Vertex vert ); // Entfernt vert und seine edges void clear_vertex( Vertex vert ); // Entfernt nur die edges von vert void add_edge( Vertex source, Vertex target ); void remove_edge( Vertex source, Vertex target ); private: std::vector<Vertex*> vertices; }; // Iteratoren fehlen nochOder so ähnlich, am besten als Template

