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

问题描述

我正在寻找一种算法,该算法告诉我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-空空间,X-墙,起点A(0,0)和终点B(4,4)。我想做的是检查我可以移除一条墙多少次才能使路径存在,并且端点可以到达。

解决方法

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

在搜索之前,A *搜索算法做出了明智的决定,即下一步应该探索哪些细胞,并且这样做可以通过不探究“不感兴趣的”节点(细胞)来更快地进行搜索。

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

一个很好的网格启发式方法是manhattan distances

,

如果只有2个点AB可以在2D网格中进行检查,则可以采用depth first searchbreadth first search来检查路径是否存在。 / p>


如果以查询的形式为您提供网格和几对要检查的点,则可以采用以下方法:

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

  • 我们将使用深度优先搜索(或广度优先搜索),无论您希望标记这些单元格是什么。

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

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

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

enter image description here enter image description here

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

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