查找路径是否存在的最有效算法

Most efficient algorithm to find if a path exists

我正在寻找一种算法来告诉我 A 点和 B 点之间是否存在路径。 我不需要知道路径到底是什么,我只需要知道它是否存在,执行时间是关键。基本网格有空地或墙壁,只有这两个。 你们有什么建议吗?

编辑:我想我会澄清一下。我有一个像这样的基本网格:

O O O X O
O O O X X
O O O X O
O O X X O
O O O X O

其中 O - 空 space,X - 墙,起点 A(0, 0) 和终点 B(4, 4)。我想做的是检查我可以移除多少次单个墙以使路径存在,终点可到达。

如果您的二维网格中只有 AB 两个点需要检查,您可以采用 depth first search or breadth first search 检查路径是否存在。


如果以查询的形式给你网格和几对点来检查,你可以采用以下方法:

  • 我们仅在未访问的空单元格上逐个单元格地迭代二维网格。

  • 我们将使用深度优先搜索(或广度优先搜索)来标记这些单元格。

  • 标记过程包括移动空单元格并用值(比如数字)标记它们。所有连接的空单元格形成一个岛。

  • 这样,如果任意2对点属于同一个岛,则它们之间存在路径,如果不属于同一个岛,则不存在路径。

您可以参考下面的图片以获得更好的可视化效果。在这里,黑色单元格是墙壁,彩色单元格是岛屿,表示标有某个值的单元格属于同一连接组件。

  • 在上述算法中,用颜色或数字标记每个单元格的时间复杂度为O(m * n),其中mn是.行和列,因为我们在 DFS 或 BFS 期间只访问每个单元格一次。

  • 回答任何 2 对点的每个查询的时间复杂度将为 O(1)

A*及其变体常用于此类问题。

A* 搜索算法会在探索之前就下一步应该探索哪些单元做出明智的决定,并且通过这样做,它可以通过不探索“不感兴趣”的节点(单元)来加快​​搜索速度。

由于您不太关心最优性,您还可以利用bounded relaxation,这通常会加快搜索速度(以最优性为代价)。

网格的一个很好的简单启发式算法是 manhattan distances