Java 为什么这叫做回溯?

Java 为什么这叫做回溯?,java,algorithm,backtracking,Java,Algorithm,Backtracking,我在维基百科上读过,也在谷歌上搜索过 但我不明白“回溯算法”是什么意思 我从“破解代码访谈”中看到了这个解决方案 想知道为什么这是一个回溯算法 “回溯”是一个出现在枚举算法中的术语 您构建了一个“解决方案”(即为每个变量分配一个值的结构) 但是,在构建过程中,您可能会意识到解决方案不成功(不满足某些约束),然后回溯:您撤消对变量的某些赋值,以便重新赋值 示例: 根据您的示例,您希望在二维栅格中构造路径。因此,从(0,0)开始生成路径。例如: (0,0) (0,0) (1,0) go right

我在维基百科上读过,也在谷歌上搜索过

但我不明白“回溯算法”是什么意思

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

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

“回溯”是一个出现在枚举算法中的术语

您构建了一个“解决方案”(即为每个变量分配一个值的结构)

但是,在构建过程中,您可能会意识到解决方案不成功(不满足某些约束),然后回溯:您撤消对变量的某些赋值,以便重新赋值


示例

根据您的示例,您希望在二维栅格中构造路径。因此,从(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
....
发件人:

回溯是一种通用算法,用于查找某些计算问题的所有(或部分)解决方案,该算法以增量方式构建解决方案的候选方案,并在确定c不可能完成为有效解决方案时放弃每个部分候选方案c(“回溯”)

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

这基本上就是上面的代码所做的:它在基本情况下返回true,否则它“尝试”右路径或左路径,丢弃不起作用的解决方案

由于上面的代码是递归的,所以可能不清楚“回溯”在哪里起作用,但该算法实际做的是从部分解决方案构建一个解决方案,在您的示例中,最小可能的解决方案在第5行处理。算法的非递归版本必须从最小的解决方案开始,并从那里构建

我搞不懂“回溯算法”是什么意思

当一个算法尝试一个解决方案时,它是“回溯”,一旦失败,它会返回到一个更简单的解决方案,作为新尝试的基础

在这个实施过程中,

current_path.remove(p)

当当前路径未成功时,沿路径返回,以便调用方可以尝试导致
当前路径的另一种路径变体

回溯有时是一种递归形式

这种基于布尔运算的算法面临一个选择,然后做出那个选择,然后在最初的选择之后出现一组新的选择


从概念上讲,您从树的根开始;这棵树可能有一些好的叶子和一些坏的叶子,尽管这些叶子可能都是好的,也可能都是坏的。你想得到一片好叶子。在每个节点上,从根开始,您选择其子节点中的一个移动到,并一直保持这个状态,直到找到一个叶子为止。(参见下图)

示例说明:

  • 从根开始,选择A和B。选择A
  • 在A,你的选择是C和D。你选择C
  • C是坏的。回到A
  • 在A,您已经尝试了C,但失败了。试试D
  • D不好。回到A
  • 在A,你没有其他选择可以尝试。回到根上来
  • 从根本上说,你已经试过A。试过B
  • 在B,你的选择是E和F。试试E
  • E是好的。恭喜你
    来源:

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

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

    此代码破坏了面试,因为它违反了Java代码样式,因为最初您检查第一个房间的抽屉,但没有找到,所以您回溯出第一个房间,检查下一个房间的抽屉。它也被称为试错法。这是一个很好的图形解释!所以你连F都不试试?这仅仅是为了寻找一个好结果的算法吗?在这个例子中,本质上是这样的。这是递归/枚举;人们可以修改以寻找所有的好叶子。但在这种情况下,我们只寻找一个(第一个访问的)@User1065869这是否仅适用于只寻找一个好结果的算法?不。有时您对所有解决方案感兴趣,或者对“最佳”五个解决方案感兴趣(如果您可以比较两个解决方案)。但从你有时需要“销毁”你先前构建的一部分来重新分配变量的那一刻起,它就被称为回溯算法。不,它不是。如果您要求prolog(通常使用回溯)求解x=2,y=x,那么它不会尝试x的所有值或y的所有值,并且只返回值2。