对算法不熟悉并在网上搜索过,包括stackoverflow的一些答案,我仍然发现自己在询问如何在简单矩阵中找到这些节点之间的距离。
首先,简单的矩阵:
public class MatrixRoutes {
int[][] position; // matrix
int size;
MatrixRoutes(int dimentions) {
posicion = new int[dimentions][dimentions];
size= dimensiones;
}
}
我用简单的
设置矩阵的大小 MatrixRoutes r = new MatrixRoutes(5);
酷!我有空格!
用最简单的数据填充它,距离:
r.position[0][1] = 1;
r.position[1][1] = 0;
r.position[0][2] = 2;
r.position[2][2] = 0;
r.position[0][3] = 3;
r.position[3][3] = 0;
r.position[0][4] = 4;
r.position[4][4] = 0;
r.position[0][5] = 5;
r.position[5][5] = 0;
我的测试距离矩阵,都准备好进行测试。
好吧,让我的节点有距离。现在这是找到最短距离的问题。我一直在阅读有关Java的不同算法及其实现。
我想实现Dijkstra的算法,但它似乎只接受一个起始数,用作距离变量?当我需要两个变量之间的距离时,这不是我需要的。
这是我尝试实现算法的方法:
private static int buscarRutaMasRapida(MatrixRoutes g, int nodeOrigin, int nodeDestiny)
{
int[] found = new int[g.position.length];
boolean[] visitedNode = new boolean[g.position.length];
int max = 999;
for (int i = 0; i < g.position.length; i++)
{
mejor[i] = max;
visitedNode [i] = false;
}
found[nodeOrigin+ nodeDestiny] = nodeOrigin + nodeDestiny;
for(int i = 0; i < g.position.length; i++)
{
int min = max;
int nodoNow = nodeOrigin;
for (int j = 0; j < g.position.length; j++)
{
if (!visitedNode [j] && found [j] < min)
{
nodoNow = j;
min = found [j];
}
}
visitedNode [nodoNow ] = true;
for (int j = 0; j < g.position.length; j++)
{
if (g.position[nodoNow ][j] < max && found[nodoNow ] + g.position[nodoNow ][j] < found [j])
{
found[j] = found [nodoNow ] + g.position[nodoNow ][j];
}
}
}
return found [g.position.length - 2];
}
所有我要问的是一个能够知道算法的人,他会在正常邻接矩阵或距离矩阵中找到两个节点之间的最短距离。
答案 0 :(得分:0)
Dijkstra是(我的)首选路线。它接收一个节点并找到所有其他节点的最短路径。通常,对于两个节点之间的距离,可以在Dijkstra内部创建一个检查,以便在期望的&#34;结束时返回&#34;到达节点。
事实上,Wikipedia有非常好的伪代码供你使用。
因此,例如在Dijkstra的第一步中,您需要找到距离原点S的距离,您将查看从S到其他节点的所有距离并将其放入您的优先级队列:
queue.add(position[S][x]); //Do this for all x adjacent to S
答案 1 :(得分:0)
如果你需要存储每个点之间的距离,那么如果邻接图是密集的,那么重复使用Dijstraka算法是低效的。
相反,您需要Floyd-Warshall algorithm。
在维基百科页面上,Dijstraka的运行时间为O(V E log V )
,而Floyd-Warshall的运行时间为O(V^3)
。在连接图表E
介于V
(单独连接)和V^2
之间(每个节点连接到其他每个节点),因此最好的将取决于您的数据。