2012-11-19 26 views
7

Ich kann keine externen Bibliotheken verwenden, also versuche ich mir einige Möglichkeiten zu überlegen, die Datenstruktur selbst zu erstellen. Ich dachte, vielleicht etwas in der Art:Wie kann ich einen gewichteten, gerichteten Graphen in Java darstellen?

public class Node{ 
    Set<Edge> adjacent; 
    int value; 
} 

public class Edge{ 
    Node target; 
    int weight; 
} 

Aber ich vermute, es gibt wahrscheinlich einen besseren Weg, es zu tun.

Mein eventueller Gebrauch für dieses Diagramm ist, den Bellman Ford-Algorithmus darauf auszuführen, aber ich brauche offensichtlich zuerst ein funktionierendes Diagramm!

Antwort

10

Die Antwort hängt sehr von den Algorithmen ab, die Sie auf Ihre Graphen anwenden möchten.

Es gibt zwei gebräuchliche Arten, eine Grafik darzustellen - eine adjacency list und eine adjacency matrix. In Ihrem Fall ist die Adjazenzmatrix eine quadratische Matrix mit Ganzzahlen, die Gewichte darstellen. Ihre Darstellung verwendet eine Adjazenzliste.

Es gibt Algorithmen, die besser auf Adjazenzmatrizen (z. B. Floyd-Warshall-Algorithmus) arbeiten. Andere Algorithmen arbeiten besser bei Adjazenzlisten (z. B. Dijkstra-Algorithmus). Wenn Ihr Diagramm spärlich ist, kann die Verwendung der Adjazenzmatrix unerschwinglich sein.

+0

Durch Arbeit besser meinst du nur, dass sie effizienter sind? – Hoser

+1

@Hoser In den meisten Fällen lautet die Antwort "Ja". Spezialfälle wie Floyd-Warshall benötigen eine Matrix, um zu funktionieren. Sie können die Adjazenzlisten-Darstellung bis zu dem Punkt beibehalten, an dem Sie den Algorithmus ausführen, die Matrix erstellen, um sie auszuführen, und schließlich die Matrix zurück in eine Adjazenzliste konvertieren. – dasblinkenlight

+0

In Ordnung danke. Was ist mit beiden davon, dass sie die Richtung unterstützen? Wird die Richtung tatsächlich durchgesetzt, oder muss ich das selbst regeln? – Hoser

2

Wie üblich können Sie Graphen als Adjazenzlisten oder Adjazenzmatrizen darstellen. Die Wahl hängt wirklich von den Details Ihres Problems ab.

Mit einer Adjazenzmatrix können Sie einfach eine Matrix von ganzen Zahlen haben, die das Gewicht darstellen.

Wenn Sie sich für eine Adjazenzliste entscheiden, können Sie einfach eine Liste der Ganzzahlen speichern (vorausgesetzt, die Knoten Ihres Diagramms sind durch einen ganzzahligen Wert gekennzeichnet), ähnlich wie bei Ihnen.

+0

funktioniert eine Adjazenzmatrix Stützkante Gewicht ? – Hoser

+1

Ja, ich korrigiere die Antwort. Sie können die Gewichte auf der Matrix haben (Linie X, Spalte Y hat das val Z, bedeutet die Kosten von X bis Y ist Z) – leo

+0

In Ordnung danke. Die Adjazenzmatrix scheint eine gute Möglichkeit zu sein, dies zu tun. Wie unterstützt es die Richtungsanforderung? Gibt es einen bestimmten Grund, warum eine Adjazenzmatrix dich zwingt, einen bestimmten Weg zwischen Knoten zu gehen, oder ist es nur etwas, das ich unbedingt vermeiden muss? – Hoser

0

einen Knoten, wie in einem ungewichteten Graph verwenden kann, um eine Liste von Knoten halten, die er angeschlossen ist, und fügt zusätzlich die mit den Anschlüssen verbunden sind Gewichte als:

public class Node{ 
    int value; 
    HashMap<Node,Integer> adjacency; 
} 
Verwandte Themen