回溯算法理论基础(参考代码随想录)

76 阅读1分钟

回溯与递归

回溯是递归的副产品,只要有递归就会有回溯。

回溯函数也就是递归函数,指的都是一个函数

效率

回溯的本质是穷举,回溯是一种暴力解法。

处理问题

  • 组合问题:N个数里面按一定规则找出k个数的集合(不强调顺序
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式(强调顺序
  • 棋盘问题:N皇后,解数独等等

回溯的抽象:n叉树

  • 回溯法解决的问题全都可以抽象为树形结构。
  • 回溯法解决的都是在集合中递归查找子集。集合的大小就构成了树的宽度,递归的深度,都构成的树的深度

n叉树

  • 宽度:处理集合的大小 (for)
  • 高度:递归深度 (递归)

模版

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}