为什么对于需要 Djikstras 算法作为解决方案的问题,我们会看到 2 种不同的可视化效果?
在一种情况下,我看到节点相互连接,另一种格式是二维数组。 有没有办法将二维数组转换或在心理上可视化为连接的节点?
我想知道,以便我清楚解决问题的方法。
请参阅此处的参考资料:
节点最短路径方法,其代码如下:
class Node {
private Map<Node, Integer> adjacentNodes = new HashMap<>();
// ...
}
二维数组最短路径方法,从节点可视化开始,然后移动到这个二维数组:
int graph[][] = new int[][] {
{0, 4, 0, 0, 7},
{4, 0, 1, 2, 0},
{0, 1, 0, 6, 0},
{0, 2, 6, 0, 0},
{7, 0, 0, 0, 0}
};
这两个参考文献使用两种不同但常见的图形表示形式:
邻接列表
引用的代码如下所示:
class Node {
private Map<Node, Integer> adjacentNodes = new HashMap<>();
// ...
}
...然后调用 Node 构造函数和方法来实际创建实际图的节点和边。
邻接矩阵
引用的代码如下所示:
int graph[][] = new int[][] {
{0, 4, 0, 0, 7},
{4, 0, 1, 2, 0},
{0, 1, 0, 6, 0},
{0, 2, 6, 0, 0},
{7, 0, 0, 0, 0}
};
维基百科上记录了这两种数据结构:
邻接矩阵:
对于顶点集 𝑈 = {𝑢1, …, 𝑢𝑛} 的简单图,邻接矩阵是一个方阵 𝑛 × 𝑛 矩阵 𝐴,当存在边时,其元素 𝐴𝑖𝑗 为 1从顶点𝑢𝑖到顶点𝑢𝑗,没有边时为零。
[...]
也可以将边权重直接存储在邻接矩阵的元素中。
邻接列表:
图的邻接列表表示将图中的每个顶点与其相邻顶点或边的集合相关联。
本文继续详细介绍如何实现这一点,因为有很多方法可以实现。
这两种结构各有优缺点。两篇维基百科文章都提到了其中的一些权衡,包括空间和时间效率问题。
我想补充一点,在这个特定的矩阵表示中,无法对权重为零的边缘进行编码,因为 0 被保留用于指示存在没有边缘。
出于 Dijkstra 算法的目的,使用邻接表方法通常会更有效。边界情况是图在(几乎)任何一对顶点之间都有边——在这种情况下,邻接矩阵可能更有用。