在NxN矩阵中,什么算法找到两个节点之间的最短路径?

时间:2015-06-12 01:17:21

标签: java algorithm matrix

对算法不熟悉并在网上搜索过,包括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];
}

所有我要问的是一个能够知道算法的人,他会在正常邻接矩阵或距离矩阵中找到两个节点之间的最短距离。

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之间(每个节点连接到其他每个节点),因此最好的将取决于您的数据。