-
枚举结构
循环加判断
-
二分算法
范围必须是离散的
切已知范围的最大值和最小值
-
分治
- 该问题的规模缩小到一定的程度就可以容易地解决
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
- 利用该问题分解出的子问题的解可以合并为该问题的解;
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
-
递归
结构性递归和过程型递归
不管是过程递归还是结构递归首先要明确的就是一定要抛弃程序设计的细节,如果在设计过程中扣住细节,试图弄清楚每一步执行过程,你就失败了。
递归设计的设计者首先要明确的是你的递归函数的功能,比如阶乘int fun(int n),他的功能就是返回n的阶乘,设计过程中要时时记住自己递归函数的设计目的。
其次就是递归程序的出口设计,这一点是比较灵活的,不同问题有不同的设计。
最后就是一定要有规模的递减。在整个递归设计过程中,一定要严格注意和把握这几点,缺一不可。
-
动态规划
(1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
(2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)
-
深度优先搜索
深度优先遍历图的方法(一种递归的定义)是,假定给定图G的初始状态是所有顶点均未被访问过,在G中任选一 个顶点i作为遍历的初始点,则深度优先搜索递归调用包含以下操作:
(1)访问搜索到的未被访问的邻接点;
(2)将此顶点标记为已访问节点;
(3)搜索该顶点的未被访问的邻接点,若该邻接点存在,则从此邻接点开始进行同样的访问和搜索。
-
广度优先搜索(BFS)
广度优先搜索依赖的是队列解决问题。队列中的每一个节点需要包含记录以下内容:该节点到起点的距离dist,该节点的前驱节点past,该节点在当前路径下是否被访问过visit(0表示没有访问过,1表示当前路径下正在访问,2表示该节点周围的所有节点都已经被访问过)。
编程逻辑大致如下:
-
贪心算法确定贪心算法模型
将问题分解成子问题,并确定子问题的最优解
子问题的局部最优解堆叠出全局的最优解
网友评论