2017-07-20 2 views
0

Mon anglais ne va pas très bien, MAIS je vais essayer de mon mieux pour expliquer mon problème ici. Je travaille sur une application dans laquelle je dois créer un graphique. Pour l'instant j'utilise GraphStream.Trouver les nœuds cachés entre deux nœuds - graph - java

Exigences pour mon graphique est très compliquée, qui est:

J'ai une table nommée CDR (Call Data Record) dans lequel j'ai 2 colonnes et ANombre BNUMBER. La structure de la table est très claire qu'il montre que Anumber a appelé Bnumber et il y a une autre colonne pour DATETIME, qui montre la date et l'heure de l'appel. MAIS j'ai besoin ici seulement de deux colonnes.

Disons que nous avons 4 chiffres ici: 123, 456, 789, 000 et structure de la table est comme ça

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

Ma table ici montre clairement que 123 n'a pas appeler 000 Mais 123 appelé 456 et 789 et ces deux numéros appelés 000 donc je dois montrer le graphique dirigé entre 123 et 000 ce qui montre sans doute comme celui-ci 123->456->000 et 132->789->000

donc, la question est que je ne sais pas comment trouver ce chemin entre 123 et 000. Il peut y avoir plus de 2 numéros comme 5 ou 6 numéros et j'ai e pour trouver les numéros cachés entre tous les numéros donnés 5 ou 6 AS dans le scénario ci-dessus 456 et 789 sont des numéros cachés entre 132 et 000.

Et une chose de plus ma table contient plus de 20 millions de lignes et à l'avenir évidemment le nombre de lignes augmentera très rapidement lorsque l'utilisateur s'appellera.

CE QUE JE FAIT AUTANT FAR:

J'ai fait quelques R & D sur cette question mais n'a pas trouvé de bonne bibliothèque ou d'une solution pour cela. Jusqu'à présent, je pense que Dijkstra's Algorithm est le meilleur pour mon scénario que GraphStream fournit heureusement cet algorithme here. Ce que je veux de vous, Donnez-moi une idée que cet algorithme me donnera le résultat désiré OU je dois trouver n'importe quelle autre bibliothèque d'algo ou de graphique qui conviendra le mieux à mon problème. Je ne suis pas bon à ALGO's c'est pourquoi je suis ici pour toute aide ou directive Si vous pouvez me donner. Merci

+0

Dans la page Web que vous liez, il est indiqué qu'il existe quelques méthodes pour itérer sur le chemin le plus court. (getPathEdges (Noeud), getPathEdgesIterator (Noeud), getPathNodes (Noeud) et getPathNodesIterator (Noeud)).Je crois que getPathEdges (Node) et getPathNodes (Node) vous donnent l'information que vous voulez. Essayez de les utiliser et commentez s'ils font le travail. –

+0

Bien sûr. Je vais essayer et si cela vient en fonction de mes besoins, je posterai ma solution ici –

+0

Encore, je vous recommande de comprendre et d'implémenter l'algorithme de Dijkstra par vous-même. Ce n'est pas difficile à comprendre et ainsi vous serez capable de le modifier pour tout ce que vous pourriez vouloir le faire. –

Répondre

0

Vous n'avez pas du tout besoin de l'algorithme de Dijkstra, car vous n'avez pas de coûts sur les bords. Vous avez besoin de l'algorithme simple BFS. Voici implementation simple mais vous devez ajouter un tableau 'labels' pour marquer les noeuds visités. Donc, après BFS, vous pouvez restaurer le passage de chaque noeud au noeud source (123 dans votre cas) ou dire que le noeud ne peut pas être atteint à partir du noeud donné (si l'étiquette de ce noeud reste 0). Vous devez ajouter l'étiquette de la manière suivante:

toutes les étiquettes est égal à 0 au démarrage

lorsque vous visitez un nouveau noeud que vous définissez est étiquette current_node_label + 1

Mais Dijkstra peut vous aider si vous définissez le coût de chaque bord comme 1. Ce n'est pas une façon efficace de vous poser problème.