即使在伪代码中,我也无法弄清楚如何实现它。用户输入以下内容:
[
[
[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算法?
此图片可能有助于(不缩放):
绿色是开始,红色是结束。
答案 0 :(得分:1)
请注意,如果我们将数组中的条目视为一对(x, y)
,则给定的数组是二维的。
基本思想是构建图形,分配边缘成本,然后应用标准Dijkstra算法。
构建图表:
制作2个哈希表H
和Q
,其中H([x,y])
将顶点(x,y)
映射到0
和n - 1
之间的数字,{ {1}}将Q
和0
之间的整数映射到顶点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]
的键应该是一对整数。
现在我们可以将顶点视为H
和0
之间的数字来构建图表。我们可以将图表表示为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算法。要查找两个顶点g
和u
之间边的成本,我们可以使用哈希表v
来获取Q
和u
的坐标。然后边缘的成本是点v
和Q[u]
之间的Euclidean distance。
两个顶点Q[v]
和u
之间边缘成本的伪代码
v