C/C++ - Implementierung eines Gerichteten Azyklischen Graphen
Als Anfänger, ich m versuchen zu generieren, die eine DAG mit C (oder C++).
struct Node
{
Link *incomingEdge, *outgoingEdge;
};
struct Link
{
Node *origin, *destination;
};
einfach in meinem code gibt es nur einen eingehenden und ausgehenden Kanten für jeden Knoten. Aber einen Knoten haben könnte mehrere inzidente Kanten. Außerdem, die Anzahl der inzidenten Kanten ändern könnte für jeden Knoten.
wie kann ich erzeugen unterschiedliche Anzahl von Zeigern für jeden Knoten ?
davon ausgehen, dass ich;
nodeA mit 5 eingehende Kanten und 4 ausgehende Kanten.
nodeB mit 3 eingehende Kanten und 6 ausgehenden Kanten.
so viele Zeiger ändern sich für jeden Knoten.
" wie kann ich generieren unterschiedliche Anzahl von Zeigern für jeden Knoten ?' Was meinst du mit generieren? Fragen Sie, wie zu halten, mehr als einen einzigen Zeiger für die inzidenten Kanten? Dann können Sie so etwas wie
Möchten Sie vielleicht zu prüfen, mit einem Nachbarschaft-Liste. Zudem: wenn Sie planen, über die Verwendung einer Struktur eher als ein anderer vielleicht Programmierer.se könnte eine bessere Wahl sein.
gut, ich möchte oft löschen von Knoten und Kanten, und fügen Sie Nachrichten lieben..Das ist der Grund, warum ich nicht wollen, zu prüfen, Nähe listet.
ein Vektor-container wäre schön, aber wenn ich wollen suchen oft durch Vektor -, ist es eine effiziente Art und Weise ?
std::vector<Link*> incidentEdges;
.Möchten Sie vielleicht zu prüfen, mit einem Nachbarschaft-Liste. Zudem: wenn Sie planen, über die Verwendung einer Struktur eher als ein anderer vielleicht Programmierer.se könnte eine bessere Wahl sein.
gut, ich möchte oft löschen von Knoten und Kanten, und fügen Sie Nachrichten lieben..Das ist der Grund, warum ich nicht wollen, zu prüfen, Nähe listet.
ein Vektor-container wäre schön, aber wenn ich wollen suchen oft durch Vektor -, ist es eine effiziente Art und Weise ?
InformationsquelleAutor zaratushtra | 2014-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Prüfen, mit einem Vektor von Zeigern
wenn Sie brauchen, oft zum suchen nach bestimmten Kante, verwenden von std::map< - Taste, Link*> oder std::set<Link*>, je nach Ihrer Datenstrukturen. Von diesem Behälter finden, die member-Funktionen
aber wie kann ich erklären, dass diese Vektor - (Punkte, an einem anderen struct-Link) im Knoten struct. mein compiler nicht funktioniert.
Finden sicherlich funktioniert. Wenn die Anzahl der Kanten ist groß pro Knoten, dann eine Karte vorgezogen werden. Wenn das nicht schnell genug ist, vielleicht eine Art von hashing auf den Zeiger in eine Art von Bayes-Sache funktionieren könnte. Ich schlage vor, beginnend mit der einfachsten Idee, immer arbeiten, dann suchen, an der performance. Es kann gut genug sein.
InformationsquelleAutor EvilTeach
Es hängt davon ab, was Sie brauchen. Die Grafik ist völlig desccribed durch die Kanten, also die einfache Antwort ist, weglassen
*incomingEdge, *outgoingEdge
aus der Knoten-definition.Aber eine verknüpfte Liste oder einem geeigneten container von
std::
von adjecent Knoten wird wahrscheinlich besser für die algorithmen, die Sie gehen zu implementieren.Ich meinte so etwas wie Die einfach verketteten Listen der eingehenden und othoing adjecencies Aussehen kann.
struct Link { Link *theEge, *nextIOEdge; };
Ich wirklich nicht bekommen, es. Konnte Sie erklären Sie bitte es etwas.
InformationsquelleAutor Jakub