2017-07-20 6 views
0

Mein Englisch ist nicht sehr gut, aber ich werde mein Bestes versuchen, mein Problem hier zu erklären. Ich arbeite an einer Anwendung, in der ich Grafik erstellen muss. Für jetzt verwende ich GraphStream.Finden Sie die versteckten Knoten zwischen zwei Knoten - Grafik - Java

Anforderungen an mein Graph ist sehr kompliziert, das ist:

Ich habe eine Tabelle CDR (Call Data Record), in dem ich 2 Spalten aNumber und bNumber haben genannt. Die Struktur der Tabelle ist sehr klar, dass es zeigt, dass Anumber Bnumber und es gibt eine andere Spalte für DATETIME, die das Datum und die Uhrzeit des Aufrufs anzeigt. ABER ich brauche hier nur zwei Spalten.

Können sagen, wir haben 4 Zahlen hier: 123, 456, 789, 000 und Tabellenstruktur ist wie dieser

Anumber Bnumber 
------- ------- 
123  456 
123  789 
456  789 
789  000 
456  000 

Mein Tisch hier zeigt deutlich, dass 123 nicht 000 angerufen hat aber 123 genannt 456 und 789 und diese beiden Zahlen genannt 000 Also habe ich das gerichtete Graphen zeigen, zwischen 123 und 000, die wahrscheinlich wie zeigt diese 123->456->000 und 132->789->000

Also das Problem ist, ich weiß nicht, wie diesen Weg finden zwischen 123 und 000. Es kann mehr als 2 Nummern wie 5 oder 6 Nummern geben und ich habe e die versteckten Zahlen zwischen allen gegebenen 5 oder 6 Zahlen zu finden Wie im obigen Szenario 456 und 789 sind versteckte Zahlen zwischen 132 und 000.

Und eine Sache mehr meine Tabelle enthält mehr als 20 Millionen Zeilen und in Zukunft offensichtlich Die Anzahl der Zeilen wird sehr schnell anwachsen, wenn sich der Benutzer anruft.

, was ich bisher getan haben:

ich zu diesem Thema einige R & D getan haben könnte, aber keine gute Bibliothek oder eine Lösung gefunden. So weit, ich denke Dijkstra's Algorithm ist am besten für mein Szenario als GraphStream zum Glück bietet diesen Algorithmus here.

Was ich von euch will, Gib mir eine Idee, wird dieser Algorithmus mir das gewünschte Ergebnis geben ODER ich muss eine andere Algo oder Graph Bibliothek finden, die am besten für mein Problem passt. Ich bin nicht gut in ALGOs, deshalb bin ich hier, um Hilfe oder Richtlinien zu bekommen. Dank

+0

In der Webseite, die Sie verknüpfen, heißt es, dass es ein paar Methoden gibt, um über den kürzesten Weg zu iterieren. (getPathEdges (Node), getPathEdgesIterator (Node), getPathNodes (Node) und getPathNodesIterator (Node)).Ich glaube, dass getPathEdges (Node) und getPathNodes (Node) Ihnen die gewünschten Informationen liefern. Versuchen Sie, sie zu verwenden und zu kommentieren, wenn sie die Arbeit machen. –

+0

Sicher. Ich werde es versuchen und wenn es nach meinen Bedürfnissen kommt, werde ich meine Lösung hier posten –

+0

Dennoch würde ich Ihnen empfehlen, Dijkstra-Algorithmus selbst zu verstehen und zu implementieren. Es ist nicht schwer zu verstehen und auf diese Weise können Sie es für alles, was Sie tun möchten, ändern können. –

Antwort

0

Sie brauchen Dijkstra-Algorithmus überhaupt nicht, da Sie keine Kantenkosten haben. Sie benötigen einen einfachen BFS Algorithmus. Hier ist einfach implementation, aber Sie sollten "Labels" -Array hinzufügen, um besuchte Knoten zu markieren. Nach BFS können Sie also den Übergang von jedem Knoten zum Quellknoten wiederherstellen (in Ihrem Fall 123) oder sagen, dass der Knoten vom angegebenen Knoten aus nicht erreichbar ist (wenn die Bezeichnung für diesen Knoten 0 bleibt). Sie sollten Etikett auf folgende Weise hinzufügen:

alle Etiketten gleich 0 beim Start

, wenn Sie neue Knoten besuchen setzen Sie es Label als current_node_label + 1

Aber Dijkstra kann Ihnen helfen, wenn Sie Kosten eingestellt jeder Rand als 1. Es ist nur nicht effizient Weg, um Ihr Problem zu sohlen.

Verwandte Themen