我们什么时候应该使用普通 BFS 而不是双向 BFS?
When should us use normal BFS over bidirectional BFS?
我知道双向 BFS 比使用普通 BFS 有很多优势,因为理论上它可以将发现两个节点之间的最短路径的时间和确定一个节点是否可以从另一个节点访问的时间减半。
另外我明白,只有当我们唯一地定义了两个节点时,我们才应该使用双向。
在什么情况下我们应该更喜欢普通 BFS 而不是双向 BFS?
我理解双向 BFS 包括,给定起始节点和目标节点,从起始节点和目标节点交替扩展节点层,直到从两端到达中间的节点。从开始到目标的最短路径然后被理解为从开始到中间节点的最短路径,从中间到目标的最短路径继续。我可以看到,与标准 BFS 方法相比,可能需要扩展的节点更少。然而,
- 实现标准BFS(sBFS)比实现双向BFS(简称bBFS)更容易。简单往往是好的,因为它更容易编码和稍后验证其正确性。
- 如果图是有向且未加权的,sBFS保证它会以最少的步数找到从开始到目标的最短路径;不保证 bBFS 可用于有向图。
- 在运行 sBFS之后,你可以重建从起点到所有节点的最短路径,这些路径最多比目标节点早1步(即搜索停止之前)。这本身可能很有价值。 运行 bBFS 不会生成这样的列表。
考虑到这一点,我认为 bBFS 仅适用于非常狭窄的情况(根据图表,预计它的性能优于 sBFS),而 sBFS 既简单又实用更大范围的场景。
我知道双向 BFS 比使用普通 BFS 有很多优势,因为理论上它可以将发现两个节点之间的最短路径的时间和确定一个节点是否可以从另一个节点访问的时间减半。
另外我明白,只有当我们唯一地定义了两个节点时,我们才应该使用双向。
在什么情况下我们应该更喜欢普通 BFS 而不是双向 BFS?
我理解双向 BFS 包括,给定起始节点和目标节点,从起始节点和目标节点交替扩展节点层,直到从两端到达中间的节点。从开始到目标的最短路径然后被理解为从开始到中间节点的最短路径,从中间到目标的最短路径继续。我可以看到,与标准 BFS 方法相比,可能需要扩展的节点更少。然而,
- 实现标准BFS(sBFS)比实现双向BFS(简称bBFS)更容易。简单往往是好的,因为它更容易编码和稍后验证其正确性。
- 如果图是有向且未加权的,sBFS保证它会以最少的步数找到从开始到目标的最短路径;不保证 bBFS 可用于有向图。
- 在运行 sBFS之后,你可以重建从起点到所有节点的最短路径,这些路径最多比目标节点早1步(即搜索停止之前)。这本身可能很有价值。 运行 bBFS 不会生成这样的列表。
考虑到这一点,我认为 bBFS 仅适用于非常狭窄的情况(根据图表,预计它的性能优于 sBFS),而 sBFS 既简单又实用更大范围的场景。