我正在研究图搜索算法(为了这个问题,我们只允许在DFS,BreadthFS,ID上限制算法。)
所有这些算法都可以实现为正向搜索(从起始节点到结束节点)或向后搜索(从终端节点到起始节点)。
我的问题是,向后搜索何时会比向前搜索更好?那是否有一般规则?
答案 0 :(得分:2)
通过广度优先搜索或迭代加深,我认为你的问题的数学答案涉及顶点周围的“球”的概念。将Ball(v,n)定义为距节点v最多n个距离的节点集,并且让从起始节点s到目的节点t的距离为d。然后在最坏的情况下,如果| Ball(s,d)|,则前向搜索将比后向搜索执行得更好< |球(t,d)|。这是正确的,因为广度优先搜索总是(并且在最坏的情况下为ID)在访问任何深度为k + 1的节点之前扩展距起始节点一些距离k的所有节点。因此,如果周围的节点数量较少开始比目标前向搜索应该更快,而如果目标周围的节点数量少于开始和向后搜索应该更快。不幸的是,很难先验地知道这个数字;您通常要么必须运行搜索以确定是哪种情况。您可以使用两个节点周围的branching factor作为此值的启发式算法,但不一定能保证一次搜索更快。
您可能要考虑探索的一个有趣的算法是bidirectional breadth-first search,它同时从源节点和目标节点进行搜索。它往往比标准的广度优先搜索快得多(特别是,具有分支因子b和节点之间的距离d,BFS大致需要O(b d )时间,而双向BFS需要O (b d / 2 ))。一旦你有一个很好的BFS实现,它也不难编写代码。
至于深度优先搜索,我实际上并不知道确定哪个更快的好方法,因为在最坏的情况下,两个搜索都可以在找到路径之前探索整个图。如果有人对如何确定哪个更好会有一个很好的解释,那么如果他们可以发布它就会很棒。