算法思想其实是一锅炖
2023-10-16 07:37:03
起初接触「算法思想」时,会被它的「高深莫测」吓到,进而退避三舍。但如果你看过《事实》这本书,你就会对算法思想转变观念。书中提到,只要我们理解算法思想的关键点,多加练习加深理解记忆,那么学习算法思想就像切菜一样简单。
递归是上回我们探讨的算法系列的重点内容。事实上,这种编程技巧是许多算法的核心。今天,我们就来揭开算法思想的神秘面纱。我们整理了四种最基本的算法思想:分治、动态规划、回溯和贪心算法。掌握好这些算法思想的核心关键点,你就能轻松理解并运用这些算法来解决各种问题。
- 分治算法
分治法是一种递归算法,它把一个复杂的问题分解成若干个较小、易于解决的子问题,然后递归解决这些子问题,最后再将子问题的解合起来得到整个问题的解。
关键点 :将问题分为若干个子问题;递归处理每个子问题;合并子问题的解,得到整个问题的解。
步骤 :
1.将问题分为若干个子问题。
2.递归处理每个子问题。
3.合并子问题的解,得到整个问题的解。
示例 :快速排序算法使用分治法将一个列表分为两个子列表,递归地对每个子列表进行排序,然后将排序后的子列表合并成一个排序后的列表。
- 动态规划算法
动态规划是一种基于子问题的递归算法。它将问题分为若干个重叠的子问题,然后将子问题的解存储起来,以便以后需要时直接查询,避免重复计算。
关键点 :将问题分为若干个重叠的子问题;存储子问题的解;查询存储的子问题的解,避免重复计算。
步骤 :
1.将问题分为若干个重叠的子问题。
2.存储子问题的解。
3.查询存储的子问题的解,避免重复计算。
示例 :背包问题是一个典型的动态规划问题。背包问题是将一组物品放入背包中的问题,每个物品都有自己的重量和价值。目标是在背包中放入尽可能多的物品,使得背包的总重量不超过背包的最大容量,且物品的总价值最大化。动态规划算法将背包问题分为若干个重叠的子问题,每个子问题是将若干个物品放入背包中的问题。动态规划算法通过存储子问题的解,避免重复计算,从而高效地求解背包问题。
- 回溯算法
回溯算法是一种递归算法,它通过尝试不同的可能的解决方案来搜索问题的解。当发现一个可能的解决方案不满足问题的约束条件时,回溯算法会回溯到前一个状态,并尝试另一个可能的解决方案。
关键点 :尝试不同的可能的解决方案;当发现一个可能的解决方案不满足问题的约束条件时,回溯到前一个状态并尝试另一个可能的解决方案。
步骤 :
1.尝试一个可能的解决方案。
2.检查可能的解决方案是否满足问题的约束条件。
3.如果可能的解决方案满足问题的约束条件,则返回可能的解决方案。
4.如果可能的解决方案不满足问题的约束条件,则回溯到前一个状态并尝试另一个可能的解决方案。
示例 :走迷宫问题是一个典型的回溯问题。走迷宫问题是找出从迷宫的起点到终点的路径。回溯算法通过尝试不同的可能的路径来搜索从迷宫起点到终点的路径。当发现一条可能的路径遇到死胡同时,回溯算法会回溯到前一个状态并尝试另一条可能的路径。
- 贪心算法
贪心算法是一种近似算法,它通过在每一步中做出局部最优的选择,来求解问题。贪心算法不保证找到问题的全局最优解,但通常可以找到一个近似最优解,而且计算效率较高。
关键点 :在每一步中做出局部最优的选择。
步骤 :
1.在每一步中做出局部最优的选择。
2.重复第一步,直到问题得到解决。
示例 :贪心算法可以用来求解背包问题。贪心算法通过在每一步中选择最重的物品放入背包,来近似求解背包问题。虽然贪心算法不保证找到背包问题的全局最优解,但它通常可以找到一个近似最优解,而且计算效率较高。