图的搜索-双向搜索

337 阅读1分钟

双向搜索

这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

双向搜索用于查找起始节点和目的节点间的最短路径。它本质上是从起始节点和目的节点同时开始的两个广度优先搜索。当两个搜索相遇时,我们即找到了一条路径。

为了了解为什么这样更快,可以想象这样一个图:其中每个节点最多有k个相邻节点,且从节点s到节点t的最短路径长度为d

  • 在传统的广度优先搜索中,在搜索的第一层我们需要搜索至多k个节点。在第二层,对于第一层k个节点中的每个节点,我们需要搜索至多k个节点。所以,至此为止我们需要总计搜索k^2个节点。我们需要进行d次该操作,所以会搜索O(k^d)个节点。
  • 在双向搜索中,我们会有两个相遇于约d/2层处(最短路径的中点)的搜索。从s点和t点开始的搜索分别访问了大约k^{d/2} 个节点。总计大约2k^{d/2} O(k^{d/2})个节点。

两者似乎差别不大,然而并非如此,实际上差别巨大。请回想一下如下公式:(k^{d/2})\times(k^{d/2})=k^d。双向搜索事实上快了k^{d/2} 倍。

换句话说:如果我们的系统只支持在广度优先搜索中查找“朋友的朋友”这样的路径,现在则可以支持“朋友的朋友的朋友的朋友”这样的路径。我们可以支持长度为原来两倍的路径。