为什么这称为回溯?

时间:2014-06-23 18:00:58

标签: java algorithm backtracking

我在维基百科上读过,也用Google搜索过,

但我无法弄清楚“回溯算法”的含义。

我在“破解代码访谈”中看到了这个解决方案

并想知道为什么这是一个回溯算法?

enter image description here

5 个答案:

答案 0 :(得分:18)

回溯有时是一种递归形式。

这个基于布尔的算法正面临一个选择,然后做出选择,然后在初始选择之后呈现一组新的选择。


从概念上讲,你从树的根开始;树可能有一些好叶子和一些坏叶子,但可能是叶子都好或全坏。你想得到一个好叶子。在每个节点,从根开始,您选择其中一个要移动的子节点,然后保持这一点直到您到达一个叶子。(见下图)

enter image description here

示例说明:

  1. 从Root开始,您的选项是A和B.您选择A。
  2. 在A处,您的选项是C和D.您选择C。
  3. C很糟糕。回到A。
  4. 在A,你已经尝试过C,但它失败了。试试D。
  5. D很糟糕。回到A。
  6. 在A,你没有选择尝试。回到Root。
  7. 在Root,你已经尝试过A.尝试B.
  8. 在B处,您的选项是E和F.尝试E。
  9. E很好。恭喜!
  10. 来源:upenn.edu

答案 1 :(得分:7)

“回溯”是枚举算法中出现的术语。

您构建了一个“解决方案”(这是一个为每个变量赋值的结构)。

然而,在构造期间,您可能意识到解决方案不成功(不满足某些约束),然后您回溯:您撤消对变量的某些值赋值以重新分配它们。


示例

根据您的示例,您要在2D网格中构建路径。所以你开始从(0,0)生成路径。例如:

(0,0)
(0,0) (1,0) go right
(0,0) (1,0) (1,1) go up
(0,0) (1,0) (1,1) (0,1) go left
(0,0) (1,0) (1,1) (0,1) (0,0) go down
Oops, visiting a cell a second time, this is not a path anymore
Backtrack: remove the last cell from the path
(0,0) (1,0) (1,1) (0,1)
(0,0) (1,0) (1,1) (0,1) (1,1) go right
Oops, visiting a cell a second time, this is not a path anymore
Backtrack: remove the last cell from the path
....

答案 2 :(得分:1)

来自Wikipedia

  

回溯是一种通用算法,用于查找某些计算问题的所有(或某些)解决方案,逐步构建解决方案的候选者,并在确定后立即放弃每个部分候选c("回溯")那个c不可能完成一个有效的解决方案。

回溯很容易实现为递归算法。您可以通过查找大小为 n - 1的解决方案来查找大小为 n 的问题的解决方案,依此类推。如果较小的解决方案不起作用,则将其丢弃。

这基本上就是上面代码的作用:它在基本情况下返回true,否则它会尝试'正确的路径或左路径丢弃不起作用的解决方案。

由于上面的代码是递归的,因此可能不清楚"回溯"发挥作用,但算法实际上做的是从部分解决方案构建解决方案,其中最小可能的解决方案在您的示例中的第5行处理。非递归版本的算法必须从最小的解决方案开始,然后从那里构建。

答案 3 :(得分:1)

  

我无法弄清楚"回溯算法"装置

算法是"回溯"当它尝试解决方案时,如果失败,则返回更简单的解决方案作为新尝试的基础。

在此实施中,

current_path.remove(p)

在当前路径不成功时沿路径返回,以便调用者可以尝试导致current_path的路径的其他变体。

答案 4 :(得分:-1)

回溯基本上意味着尝试所有可能的选择。这通常是解决问题的天真,低效的解决方案。

在您的示例解决方案中,这正是正在发生的事情 - 您只需递归地尝试所有可能的路径: 你尝试每个可能的方向;如果你找到了成功的道路 - 好的。如果不是 - 回溯并尝试另一个方向。