【回溯算法】回溯算法学习
2023-12-26 11:30:47
回溯
-
回溯就是暴力枚举,只不过对于有些问题,能够写出来已经很不错了,例如50个for循环的嵌套,代码中肯定不能写50个for,而是通过递归来完成。回溯虽然是暴力枚举,但是可以通过剪枝优化,具体优化在回溯树上看。
-
回溯解决的问题有:组合、切割、子集、排列、n皇后
-
回溯问题都能构造成一个回溯树,解决回溯问题,一定要画回溯树;并且有固定的代码编写模板。
public void backtracking(参数) { if (终?条件) { 存放结果; return; } for(选择:本层集合中元素(树中节点孩?的数量就是集合的??)) { 处理节点; backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 } }
-
回溯方法的难点在于参数的设置、回溯方法中for循环的编写。
-
组合:对于单个集合的组合(如77. 组合),要设置startIndex,用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,…,n])每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围,就是要靠startIndex,简单来说,startIndex控制的是单集合横向变量问题。对于多个集合的组合(如17. 电话号码的字母组合),不用设置startIndex,for从0开始,但也要有一个index记录遍历第几个数字了,index是记录遍历第几个数字了。
- 注意:回溯方法的for用来横向遍历集合,参数index用来表示回溯树的深度。
文章来源:https://blog.csdn.net/m0_48904153/article/details/135210770
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!