我在维基百科上读过,也用Google搜索过,
但我无法弄清楚“回溯算法”的含义。
我在“破解代码访谈”中看到了这个解决方案
并想知道为什么这是一个回溯算法?
答案 0 :(得分:18)
回溯有时是一种递归形式。
这个基于布尔的算法正面临一个选择,然后做出选择,然后在初始选择之后呈现一组新的选择。
从概念上讲,你从树的根开始;树可能有一些好叶子和一些坏叶子,但可能是叶子都好或全坏。你想得到一个好叶子。在每个节点,从根开始,您选择其中一个要移动的子节点,然后保持这一点直到您到达一个叶子。(见下图)
示例说明:
来源: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)
回溯基本上意味着尝试所有可能的选择。这通常是解决问题的天真,低效的解决方案。
在您的示例解决方案中,这正是正在发生的事情 - 您只需递归地尝试所有可能的路径: 你尝试每个可能的方向;如果你找到了成功的道路 - 好的。如果不是 - 回溯并尝试另一个方向。