有人能帮助我更快地实现Dijkstra算法的j2ME实现吗?我有两个循环,一个在另一个内。喜欢这个
while(for each item in Q)
{
//...do something.
//the following loop is to find the minimum
for(all un-visited nodes in Q)
{
//.. do something to get min.
}
}
我有近23000个节点和50000个连接它们的边缘...在下面提到的所有改进之后,内部循环平均执行169330131次。这需要5分钟才能在我的w910i手机上完成,并且在我的模拟器上花费超过几分钟。这对我来说太过分了。有任何改进建议吗?我已经实施了以下改进。
答案 0 :(得分:2)
我认为你问题中的算法是错误的。内循环应该查看外循环中项目的每个未访问的邻居:
for each (item in Q)
{
for each (unvisited neighbour of item)
{
}
}
将其与pseudocode implementation in wikipedia:
进行比较 1 function Dijkstra(Graph, source):
2 for each vertex v in Graph: // Initializations
3 dist[v] := infinity // Unknown distance function from source to v
4 previous[v] := undefined // Previous node in optimal path from source
5 dist[source] := 0 // Distance from source to source
6 Q := the set of all nodes in Graph
// All nodes in the graph are unoptimized - thus are in Q
7 while Q is not empty: // The main loop
8 u := vertex in Q with smallest dist[]
9 if dist[u] = infinity:
10 break // all remaining vertices are inaccessible
11 remove u from Q
12 for each neighbor v of u: // where v has not yet been removed from Q.
13 alt := dist[u] + dist_between(u, v)
14 if alt < dist[v]: // Relax (u,v,a)
15 dist[v] := alt
16 previous[v] := u
17 return previous[]
答案 1 :(得分:1)
您的实施有问题。它的复杂性是O(E + V * log2(V))。
这意味着50000 + 23000 * ~15 = 400 000次迭代。
您当前的复杂程度几乎为O(V ^ 2)。
答案 2 :(得分:1)
我提到了这个算法。我在其他地方找到了一个更简单的算法。请注意,如果我必须在Wikipedia中实现一个,那么有两个内部循环。
while Q is not empty: //Outer loop.
u := vertex in Q with smallest dist[];// First inner loop.
....
for each neighbor v of u: //Second inner loop.
第二个内环较小。它可能最多执行4-5,因为每个节点最多有5个边。具有多于2个边的节点的数量是23000个总节点中的1000个。因此,内循环的执行时间可以忽略不计。第一个内循环是问题。寻找最小的节点。由于我必须在j2ME设备上执行此操作,因此我必须尽量减少占用的空间。