算法的设计思想
1、贪婪法 greedy algorithm
又称贪心算法。它的每次决策都是以当前情况为基础并根据某个最优原则进行选择,不从整体考虑其他可能的情况。对于特定问题是非常有效的方法,但往往不是最优解。
步骤: 1)建立对问题精确描述的数学模型,包括定义最优解的模型。
2)将问题分解为一系列子问题,同时定义子问题的最优解结构。
3)应用贪心原则确定每个问题的局部最优解,并根据最优解的模型,用子问题的局部最优解堆叠出全局近似最优解。
2、分治法 divide and conquer
将无法解决的大问题分解成一系列规模较小的相同问题,然后逐个解决小问题。
步骤:
1) 分解:将问题分解为若干个规模较小,相互独立且与原问题形式相同的子问题,确保各个子问题的解具有相同的数据结构。
2)解决:如果上一步分解得到的子问题可以解决,则解决这些子问题。否则,使用上一步相同的方法再次分解,然后求解分解后的子问题,这个过程可能是一个递归的过程。
3)合并:将上一步解决的各个子问题的解通过某种规则合并起来,得到原问题的解。
3、动态规划
和分治法一样,动态规划解决复杂问题的思路也是对问题进行分解,通过求解小规模的子问题再反推出原问题的结果。但是动态规划并不是简单的按照“大事化小”的方式进行的,而是沿着决策的阶段分子问题的,决策的阶段可以随时间划分,也可以随着问题的演化状态划分。这些子问题不是互相独立的,而是通常都有包含关系,甚至两个子问题可以包括相同的子子问题。
4、穷举法(枚举法)
确定问题的解(或状态)的定义,解空间的范围以及正确解得判定条件。根据解空间的特点选择搜索策略,一一检验解空间中的候选解是否正确,必要时可辅助一些剪枝算法,排除一些明显不可能是正确解得检验过程,提高穷举得效率。
穷举解空间的策略:
1)盲目搜索算法
广度优先搜索和深度优先搜索。
2)启发式搜索算法
利用搜索过程中出现的额外信息直接跳过一些状态,避免盲目的、机械式的搜索,就可以加快搜索算法的收敛。
3) 剪枝策略
从某个节点开始遍历得到的子树,可能存在正确的解,但是肯定不是最优解,就可以跳过此状态节点的遍历,这将极大地提高算法的执行效率。