什么时候使用回溯模板,什么时候不使用?

时间:2020-10-03 14:13:53

标签: algorithm

我看到了很多关于SO回溯解释的帖子,但是仍然令我困惑的是,什么时候我在解决问题时实际使用回溯模板(choose-explore-unchoose)而不是普通的DFS心态?我知道这两种方法本质上都是回溯,但是从解决问题的角度来看,当您看到此类问题时,传统的DFS方法会感觉更加直观。但是,我想知道您何时应该选择“选择-探索-取消选择”。

例如:如果您要打印所有从根到叶的路径,那么一种简单的DFS问题解决方法很有意义,而在打印字符串排列时,我们采取“ choose-explore-unchoose”战略。我很难把问题归类到这两个桶中。 (分类是目前用于使我的思想朝某个方向思考的当前策略。如果还有其他策略需要解决,欢迎任何人分享。)

这是我指的模板:

function dfs(node, state):
    if state is a solution:
        report(state) # e.g. add state to final result list
        return

    for child in children:
        if child is a part of a potential solution:
            state.add(child) # make move
            dfs(child, state)
            state.remove(child) # backtrack

1 个答案:

答案 0 :(得分:1)

正如您所说,DFS本质上是回溯:选择(孩子),探索(他的所有孩子)并取消选择(移至下一个孩子)。

回溯可能还有其他一些不同的方法,但这更多地取决于启发式方法。如果您寻找图算法(例如“ A-star”系列算法),则会看到许多与DFS不同的回溯算法样式。区别在于它们所依赖的启发式方法以及搜索顺序:就像进行少量更改一样,您可以获得BFS而不是DFS。

没有什么“规则”可以知道何时使用。只要您知道如何使用所有工具箱/

,对您来说更直观的选择就可以了
相关问题