在回溯方面解释BFS和DFS

时间:2010-04-25 16:57:16

标签: graph backtracking depth-first-search breadth-first-search

关于深度优先搜索的维基百科:

  

深度优先搜索(DFS)是一个   遍历或搜索的算法   树,树结构或图形。一   从根开始(选择一些   节点作为图形情况下的根)   并尽可能地探索   回溯之前的每个分支。

那么什么是广度优先搜索?

  

“选择起点的算法   节点,检查所有节点回溯,   选择最短路径,选择邻居节点回溯,   最后选择了最短路径   找到最佳路径因为   因连续而遍历每条路径   回溯。

正则表达式find的修剪 - 回溯?

由于其使用的多样性,回溯一词令人困惑。 UNIX的find修剪SO用户解释了回溯。如果您不限制正则表达式的范围,Regex Buddy使用术语“灾难性回溯”。它似乎是一个过于广泛使用的伞形术语。所以:

  1. 如何为图论理论定义“回溯”?
  2. 广度优先搜索和深度优先搜索中的“回溯”是什么?
  3. [补充]

    关于回溯和示例的良好定义

    1. The Brute-force method
    2. Stallman(?)发明了术语"dependency-directed backtracking"
    3. 回溯和regex示例
    4. Depth First Search definition.

1 个答案:

答案 0 :(得分:17)

混淆是因为回溯是在搜索过程中发生的事情,但它也指的是一种特定的问题解决技术,其中进行了大量的回溯。这些程序被称为后退者。

开车进入一个街区,总是看到你看到的第一个转弯(让我们假设没有环路),直到你走到死路,然后你开车回到下一条未经检查的街道的交叉路口。这是“第一种”回溯类型,它大致相当于该词的口语用法。

更具体的用法是指解决问题的策略,类似于深度优先搜索,但当它意识到不值得继续使用某个子树时会回溯。

换句话说 - 一个天真的DFS盲目地访问每个节点,直到它到达目标。是的,它在叶子节点上“回溯”。但回溯也会在无用的分支上回溯。一个例子是在Boggle板上搜索单词。每块瓷砖都被其他8块包围,所以树很大,天真的DFS可能需要很长时间。但是当我们看到像“ZZQ”这样的组合时,我们可以安全地停止从这一点开始搜索,因为添加更多的字母不会成为一个单词。

我喜欢Julie Zelenski教授的这些讲座。她使用回溯解决了8个女王,数独谜题和数字替换谜题,一切都很好动画。 Programming Abstractions, Lecture 10 Programming Abstractions, Lecture 11

树是一个图形,其中任何两个顶点之间只有一条路径。这消除了循环的可能性。当您搜索图形时,通常会有一些逻辑来消除周期,因此行为是相同的。此外,使用有向图,您不能沿“错误”方向跟随边缘。

据我所知,在Stallman的论文中,他们开发了一个逻辑系统,它不仅对查询说“是”或“否”,而且实际上通过进行最小数量的更改来修复错误查询。您可以看到第一个回溯定义可能发挥作用的地方。