算法-分治和回溯

分治和回溯

分治和回溯本质上就是递归,递归非常重要的一点就是去找重复性

重复性有最近重复性,最优重复性(动态规划)
最近重复性根据重复性怎么构造以及怎么分解,就有了分治、回溯

分治 Divide Conquer

分治的思想:
它就是一种递归,只不过它在递归状态树的时候,对一个问题又分解成了好几个子问题

递归、分治、回溯其实本质上就是找重复性以及分解问题和最后去组合每个子问题的结果

在这里插入图片描述

假如现在有一个这样的场景,需要实现录入一个字符串,其都由小写字母组成,现在需要将其转换为大写字母,使用分治去解决,就如下所示:
1.拆分,将这一组字母拆分为一个个的字母
2.转大写,将各个小写字母分别转换为大写字母
3.合并,将转换好的各个大写字母再合并回去

在这里插入图片描述

分治代码模板

def divide_conquer(problem,param1,param2,...):
#recursion terminator 递归的层级到了叶子节点,到达叶子节点也就是说这个子问题没有了已经被解决了
	if problem is None:
		print_result
		return
#prepare data 处理当前层逻辑
	data = prepare_data(problem)
	subproblems = split_problem(problem,data)
#conquer subproblems 下探到下一层
	subresult1 = self.divide_conquer(subproblems[0],p1, ...)
	subresult2 = self.divide_conquer(subproblems[1],p1, ...)
	subresult3 = self.divide_conquer(subproblems[2],p1, ...)
...
#process and generate the final result
	result process_result(subresult1,subresult2,subresult3,...
                          
#revert the current level states                          
                          
分治和递归的不同在于要将
即:在dill down 和 revert state中间再加一步,将这些dill down得到的子结果要合并在一起并返回回去

回溯 Backtracing

回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案

回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
1.找到一个可能存在的正确的答案
2.在尝试了所有可能的分步方法后宣告该问题没有答案

在最坏的情况下,回溯法会导致一次复杂度为指数时间的计算

回溯法经典问题:八皇后问题以及数独问题
	--->回溯就是不断在每一层的去试一试

练习

•	https://leetcode-cn.com/problems/powx-n/
•	https://leetcode-cn.com/problems/subsets/

•	https://leetcode-cn.com/problems/majority-element/description/
•	https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
•	https://leetcode-cn.com/problems/n-queens/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值