什么是动态规划算法?
我自己的理解是 一种自底向上的思维,求解一个复杂问题时,将复杂问题分解为不同阶段(不同子问题),先从已知的最简单的阶段(问题)开始,一步一步推导出最后的复杂情况,期间会用数组或者集合把中间结果存起来,避免重复计算。
什么是分治算法?
分治是一种自顶向下的思维,求解一个复杂问题时,将复杂问题分解成多个独立的子问题,子问题继续分解,直到子问题可以直接求解,然后将子问题的解一层一层组合成复杂问题的解。
相同点:都是将复杂问题简单化,分解成子问题 求解
不同点:
1、动态规划要求最优子结构
简而言之,就是子问题有最优解,而父问题的最优解包含子问题的最优解;
2、求解顺序不同
分治一般是自顶向下递归求解,动态规划一般是自底向上,从简单问题慢慢迭代求解;
3、时间复杂度不同
分治算法:一般使用递归实现,依赖于问题规模的指数幂,通常情况下时间复杂度较高;
动态规划:保存中间数据,避免了大量的重复计算,时间复杂度通常相对较低,但空间复杂度高,以空间换时间;
4、子问题重叠性
动态规划:子问题之间存在重叠的部分,即不同的子问题可能会多次使用相同的中间结果;
分治算法:子问题相互独立,没有重叠的部分;
什么问题可以使用动态规划解决,什么问题可以使用分治解决?
先放一个取巧的方法,根据数据范围判断,因为动态规划 是一个递推的过程,因此如果数据范围是10^5 至10^6 的话,可以考虑是不是可以使用一维动态规划来解决;如果数据范围是10^2至10^3的话,可以考虑是不是可以使用二维动态规划来做;
如果复杂问题分解出的子问题相互之间是独立的,这时可以用分治算法,反之则适合动态规划