双向搜索
这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战。
双向搜索用于查找起始节点和目的节点间的最短路径。它本质上是从起始节点和目的节点同时开始的两个广度优先搜索。当两个搜索相遇时,我们即找到了一条路径。
为了了解为什么这样更快,可以想象这样一个图:其中每个节点最多有个相邻节点,且从节点
s到节点t的最短路径长度为。
- 在传统的广度优先搜索中,在搜索的第一层我们需要搜索至多
个节点。在第二层,对于第一层
个节点中的每个节点,我们需要搜索至多
个节点。所以,至此为止我们需要总计搜索
个节点。我们需要进行
次该操作,所以会搜索
个节点。
- 在双向搜索中,我们会有两个相遇于约
层处(最短路径的中点)的搜索。从
s点和t点开始的搜索分别访问了大约个节点。总计大约
或
个节点。
两者似乎差别不大,然而并非如此,实际上差别巨大。请回想一下如下公式:。双向搜索事实上快了
倍。
换句话说:如果我们的系统只支持在广度优先搜索中查找“朋友的朋友”这样的路径,现在则可以支持“朋友的朋友的朋友的朋友”这样的路径。我们可以支持长度为原来两倍的路径。