Javascript 迪克斯特拉';三维阵列的s算法
即使在psuedo代码中,我也不知道如何实现这一点。用户输入如下内容: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]。始终有一个起点和一个终点,上一个索引中的所有点都
[
[
[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不,你没有;-)@阿尔尼塔克:我现在做了一个更好的解释,我不确定我没有解释的是什么。@每个人,我添加了一张图片