Javascript 迪克斯特拉';三维阵列的s算法

Javascript 迪克斯特拉';三维阵列的s算法,javascript,arrays,algorithm,multidimensional-array,dijkstra,Javascript,Arrays,Algorithm,Multidimensional Array,Dijkstra,即使在psuedo代码中,我也不知道如何实现这一点。用户输入如下内容: [ [ [0,1] ], [ [5,6],[7,8] ], [ [91,17],[18,42] ], [ [20,54] ] ] 基本上,这是一条路径,[0,1]映射到([5,6]和[7,8]),每个映射到([91,17]和[18,42]),以此类推,代价是点之间的距离。起点为[0,1],终点为[20,54]。始终有一个起点和一个终点,上一个索引中的所有点都

即使在psuedo代码中,我也不知道如何实现这一点。用户输入如下内容:

[
  [
     [0,1]
  ],
  [
    [5,6],[7,8]
  ],
  [
    [91,17],[18,42]
  ],
  [
    [20,54]
  ]
]
基本上,这是一条路径,[0,1]映射到([5,6]和[7,8]),每个映射到([91,17]和[18,42]),以此类推,代价是点之间的距离。起点为[0,1],终点为[20,54]。始终有一个起点和一个终点,上一个索引中的所有点都映射到下一个索引中的点

我如何为这种数据结构实现Dijkstra算法

此图像可能有帮助(不可缩放):


绿色是开始,红色是结束。

请注意,如果我们将数组中的条目视为一对
(x,y)
,则给定的数组是二维的

其基本思想是构建图,分配边的代价,然后应用标准的Dijkstra算法

构建图表:

array g[n][]                              //-- adjacency list of the graph
for(int i = 0; i < length of A - 1; i++)  //-- notice the "-1"
    for(int j = 0; j < length of A[i]; j++)
        for(int k = 0; k < length of A[i + 1]; k++)
            g[ H[A[i][j]] ].insert (H[ A[i + 1][k] ])
            g[ H[ A[i + 1][k] ].insert( H[A[i][j]] )     //-- assuming the graph is undirected
制作两个散列表
H
Q
,其中
H([x,y])
将一个顶点
(x,y)
映射到
0
n-1
之间的数字,并且
Q
0
n-1
之间的整数映射到一个顶点
(x,y)
n
是图形中的顶点数。通过循环给定的
2d
数组中的所有顶点,我们可以轻松找到
n
。让我们调用给定的数组
A

散列的伪代码:

n = 0
for(i = 0; i < length of A ; i++)
    for(int j = 0; j < length of A[i]; j++)
            H[A[i][j]] = n
            Q[n] = A[i][j]
            n++
通过这样做,我们构建了图表。现在我们可以在图
g
上应用标准Dijkstra算法。为了找到两个顶点
u
v
之间边的代价,我们可以使用哈希表
Q
来获得
u
v
的坐标。然后边的代价是
Q[u]
Q[v]
之间的点

两个顶点之间边成本的伪代码
u
v

cost(int u, int v)
    return Euclidean_distance(Q[u], Q[v])

我已经读了三遍了,但我仍然不知道这个数组是什么意思。“是路径吗?”汤姆威格斯说,我的解释稍微好一点。是的,它是路径,成本是距离。@KthProg不,你没有;-)@阿尔尼塔克:我现在做了一个更好的解释,我不确定我没有解释的是什么。@每个人,我添加了一张图片