算法
1. 回溯算法
1.概述
- 该算法可以系统性的搜索问题的所有解,它在问题的解空间树中按深度优先策略从根节点出发搜索解空间树
- 该算法搜索至解空间任一节点时,先判断当前节点是否包含该问题 的解,如果肯定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯,否则进入该子树继续按深度优先策略搜索。
- 要回溯到根,而且根节点的所有子树都被搜索遍才结束
2.步骤
- 定义问题的解空间
- 将解空间组织成树或者图的形式
- 遍历,并在搜索过程中剪枝函数避免无效搜索
3. 问题
- 有n-1种可选物品的0-1背包问题
解空间=2n−1,时间为O(n2n)
- 旅行售货员问题
解空间=(n−1)!
- 装载问题(将n个集装箱装到2艘船上)
- 批处理作业调度
- 符号三角形问题
- n后问题
4. 避免无效搜索方法
- 使用约束函数在扩展节点处减去不满足约束的子树
- 用限界函数减去得不到最优解的子树
5. 子集树与排列树
- 子集树: 当所给的问题从n个元素的集合S中找出S满足某种性质的子集时,相应的解空间,通常有
2n个叶节点
- 排列树: 当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树。通产有
n!
个叶节点
6.总结
- 回溯发产生的节点数m是解空间树节点总数的1.55%左右
2. 贪心算法
1. 概述
- 该算法总是做出在当前来看最好的选择。
- 具有贪心选择性质(整体最优解可通过局部最优的选择)和最优质结构性质(问题的最优解包含子问题的最优解)
2.
3.问题
- 活动安排问题
- 背包问题(选择物品i装入背包时,可选择物品i的一部分)(
O(nlog(n))
) - 最优装在问题
- 哈弗曼编码(
O(nlog(n))
) (前缀码:每个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其他字符代码的前缀) - 单源最短路径
- 最小生成树(Prim算法(
O(nlog(n))
), Kruskal(O(eloge)
),当e=N(n^2)时,Prim算法好,当e=o(n^2),Kruskal算法好)
3.概率算法
1. 概述
2. 算法
1. 数值概率算法
- 常用于数值问题求解
- 近似解,且近似解的精度随计算时间的增加而不断提高
2. 蒙特卡罗算法
- 求问题的准确解
- 能求得问题的一个解,未必是正确的
- 所用时间越多,得到正确解的概率越高
3. 拉斯维加斯算法
- 求正确的解
- 有时找不到
- 找到的概率随时间增加而增加
4. 舍伍德算法
- 总能求得问题的一个正确的解
- 不是避免算法的最坏情况行为,而是设法消除这种最坏情形行为与特定实例之间的关联性