分治
关键字:【递归技术】【二分查找】
分治法的设计思路:
将一个难以直接解决的大问题分解成一些规模较小的相同问题以便于逐个击破,分而治之。
分治法-递归技术
int F(int n)
{
if(n == 0) return 1;
if(n == 1) return 1;
if(n > 1 ) return F(n-1) + F(n-2);
}
分治法-二分法查找
(108条消息) 【二分查找】有这一篇足够了_快到锅里来呀的博客-CSDN博客_二分查找
https://blog.csdn.net/m0_58761900/article/details/124664975?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166504720116782248515187%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166504720116782248515187&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-124664975-null-null.nonecase&utm_term=%E4%BA%8C%E5%88%86&spm=1018.2226.3001.4450
由代码可以看出二分查找也属于分治法的一种,关于二分查找,这位博主总结的很详细。
动态规划
关键字:【查表】
动态规划的设计思路:
与分治法类似,基本思想就是将待解决的问题分解成若干个子问题,先求解子问题,然后从子问题的解得到原问题的解。与分治法不同的是,适用于动态规划法求解的问题,经分解得到的子问题往往不是独立的。若用分治法求解类似问题,则相同的问题会被求解多次,以至于最后求解原问题需要耗费指数级时间。
最常见的动态规划的题目:
爬上第 1 级只有一种方法:直接爬 1 级即可。 爬上第 2 级有两种方法:每次爬 1 级,爬两次;或者一次爬 2 级。 (数据量少我们可以尝试用列举法做出来)
动态规划的核心就是:拆分子问题,记住过往,减少重复计算
回溯
关键字:【优先搜索法(深度优先)】【迷宫问题(走不通就退后去)】
回溯法的设计思路:
一种既带有系统性又带有跳跃性的搜索算法。她在包含问题的所有解的解空间树中,按照深度优先的策略,从根节点出发搜索解空间树。
使用回溯法解决问题的过程,实际上是建立一棵“状态树(解空间树)”的过程。
例如,在解决列举集合{1,2,3}所有子集的问题中,对于每个元素,都有两种状态,取还是舍,所以构建的状态树为:
贪心
关键字:【背包问题(得不到最优解)】【0-1背包问题】【每一步取最优,结果不见得最优】【最先适宜策略(能进则进)】【最优适宜策略(能进进最大)】
贪心算法的设计思路:
经常被用来解决最优化问题,但他的最优往往是从局部最优来考虑的,每一步都选最优的方案,但这种方案不一定能得到整体上最优。
背包问题
背包问题是典型的算法问题,包括两种形式,【0-1背包问题】和【部分背包问题】。0-1背包问题是指每个物品或者全部放在背包中或者不放在背包中,求解在特定背包容量下装入背包物品的最大价值。部分背包问题中,每个物品可以部分地放入背包中,求解在特定背包容量下装入背包物品的最大价值。
基于单位重量价值最大优先的策略来将物品放入背包中,本质上是一种贪心的策略。在该策略下求0-1背包问题,不能确保得到最优解。而对于部分背包问题,是可以得到最优解的。