Dijkstra的三维数组算法

时间:2015-04-01 13:50:08

标签: javascript arrays algorithm multidimensional-array dijkstra

即使在伪代码中,我也无法弄清楚如何实现它。用户输入以下内容:

[
  [
     [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算法?

此图片可能有助于(不缩放): enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

基本思想是构建图形,分配边缘成本,然后应用标准Dijkstra算法。

构建图表:

制作2个哈希表HQ,其中H([x,y])将顶点(x,y)映射到0n - 1之间的数字,{ {1}}将Q0之间的整数映射到顶点n - 1(x, y)是图表中的顶点数。我们可以通过循环给定n数组中的所有顶点来轻松找到n。我们调用给定的数组2d

散列的伪代码:

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++ 实际上是一对整数,因此A[i][j]的键应该是一对整数。

现在我们可以将顶点视为H0之间的数字来构建图表。我们可以将图表表示为adjacency list

构建图表的Psudo代码:

n - 1

通过这样做,我们构建了图表。现在我们可以在图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 上应用标准Dijkstra算法。要查找两个顶点gu之间边的成本,我们可以使用哈希表v来获取Qu的坐标。然后边缘的成本是点vQ[u]之间的Euclidean distance

两个顶点Q[v]u之间边缘成本的伪代码

v