我使用JUNG API计算中型大图(20到100个节点)中几个节点之间的最短路径。现在我正在迭代我的节点并使用简单的'ShortetsPath'函数来计算两个节点的最短路径。所有最短路径都放在ArrayList中。
UnweightedShortestPath<Vertex, SEdge> dist = new UnweightedShortestPath<Vertex, SEdge>(undir);
ArrayList<Vertex> tv = new ArrayList<Vertex>(); // contains nodes for shortestpath
ArrayList<Integer> distances = new ArrayList<Integer>(); // for the distances
for (int j = 0; j <tv.size()-1;j++){ //iterate over nodes
Vertex one = tv.get(j);
for (int k = j+1; k<tv.size();k++){ //iterate over next nodes
Vertex two = tv.get(k);
Number n = dist.getDistance(one, two);
int d;
if (n == null) {
d = 5000000;
}
else {
d = n.intValue();
}
distances.add(d);
}
}
我想加快计算速度,因为我必须为许多图形和节点计算它。据我所知,只有Dijkstra可以在JUNG API中使用。所以我的问题是:我可以使用Dijkstra来提升性能吗? JUNG API中是否还有其他算法?使用另一个图形实现是否有意义,它为最短路径提供了更多不同的方法?
到目前为止感谢:)
答案 0 :(得分:1)
JUNG中的UnweightedShortestPath类使用广度优先搜索算法,该算法具有O(n ^ 2)运行时间。 Dijkstra算法的工作原理基本相同,仅用于加权图而不是未加权图,因此它的运行时也是O(n ^ 2)。
但是,您似乎对图中所有可能的节点对之间的距离感兴趣,但您使用的是成对方法。所以你的总运行时间是O(n * n ^ 2)= O(n ^ 3)。相反,您可以使用全局最短路径算法,如Johnson的算法(http://en.wikipedia.org/wiki/Johnson's_algorithm)。那是运行时间O(n ^ 2 * log(n + ne))。所以总体来说要快一点。
据我所知,它并没有在JUNG中实现,但你可以从谷歌代码搜索中获取它。