回溯算法总结

回溯和剪枝的概念

 

回溯算法其实是构造一棵解空间树的过程。在搜索至树中任一节点时,先判断该节点对应的部分是否是满足约束条件,或者是否超出目标函数的界,也就是判断该节点是否包含问题的最优解。

如果肯定不包含,则跳过对该节点为根的子树的搜索,即所谓的剪枝;否则,进入该节点为根的子树,继续按照深度优先策略搜索。

去重:例如求解子集的问题中,给定nums数组为1,2,2。当以1为节点的时候可以得到1,2,2的一条分支。然而另一条分支也是1,2,2。所以,在同一层上的,如果两个相邻的节点的数值相同,后面的就没必要再搜索一遍了因为和前面的节点搜索的结果是相同的。所以这条分支没有必要搜索,此为去重。去重的前提是要进行排序

 

一般格式

一般现在第一个函数中做输入数据的处理,包括为空判断,合理检查等等。以及调用backtrack进行dfs的函数。

在backtrack函数中,首先要进行边界的确定,即什么时候可以返回或者添加结果了。

接着是在for循环中做递归。for循环循环的一般是分支的内容。即可以让节点进行分支的内容。

backtracking() {
    if (终止条件) {
        存放结果;
    }

    for (选择:选择列表(可以想成树中节点孩子的数量)) {
        递归,处理节点;
        backtracking();
        回溯,撤销处理结果
    }
}


 

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值