一、常用算法和复杂度
算法 |
名称 |
复杂度 |
备注 |
快速排序 |
QuickSort(A,p,r) |
最坏:O(n2) 平均:O(nlog n) 均衡划分:O(nlog n) |
|
合并排序 |
MergeSort(A,p,r) |
O(nlog n) |
|
选最大 |
FindMax |
O(n) |
|
选最大和最小 |
FindMaxMin |
W(n)=3n/2-2=O(n) |
|
找第二大 |
锦标赛法 |
n+logn-2 |
|
选择第k小 |
Select |
O(n) |
|
动态规划:矩阵连乘 |
MatrixChain(P,n) |
递归:O(2n) 非递归:O(n3) |
|
动态规划:投资问题 |
|
O(nm2) |
m元钱投资n个项目 |
动态规划:背包问题 |
|
|
目标函数、约束条件、递推方程 |
动态规划:最长公共子序列 |
LCS_length(X,Y) LCS(B,i,j) |
W(mn)=O(mn) S(mn)=O(mn) |
|
动态规划:图像压缩 |
Compress(P,n) |
T(n)=O(n) |
|
动态规划:最大子段和 |
|
顺序:O(n3) 分支策略:O(nlog n) 动态规划:O(n) |
|
动态规划:凸多边形的三角划分 |
|
时间O(n3),空间O(n2) |
|
动态规划:电路布线 |
MNS(C,n) |
T(n)=O(n2),S(n)=O(n2) |
|
动态规划:最优二叉搜索树 |
|
T(n)=O(n2),S(n)=O(n2) |
|
贪心法:活动选择问题 |
Greedy Select |
|
|
贪心法:最优装载问题 |
Loading |
O(nlogn) |
|
贪心法:最小延迟调度问题 |
|
O(n) |
|
贪心法:找零钱问题 |
|
|
|
贪心法:装箱问题 |
|
|
|
贪心法:最优二元前缀码问题 |
Huffman(C) |
O(nlogn) |
|
贪心法:文件归并 |
Huffman算法 |
O(nlogn) |
|
贪心法:最小生成树 |
kruskal算法 |
O(nlogn) |
|
贪心法:单源最短路径 |
Dijkstra算法 |
O(n2) |
|
回溯法:四后问题 |
递归回溯,迭代回溯 四叉树,深度优先 |
指数级,蒙特卡罗法估计效率 |
|
回溯法:最有装载问题二 |
子集数,深度优先 |
指数级 |
|
分支估界:背包问题 |
代价函数,深度优先 |
|
|
分支估界:最大团问题 |
子集树 代价函数:F=Cn+n-k 约束条件 |
O(n2n) |
|
回溯法:图的m着色问题 |
|
O(nmn) |
|
分支估界:巡回售货员问题 |
|
O(n!) |
|
分支估界:圆排列问题 |
|
O((n+1)!) |
|
分支估界:电路板排列问题 |
|
O(mn!) |
|
分支估界:连续邮资问题 |
|
指数级 |
|
二、动态规划算法
设计步骤:
1) 将问题表示成多步判断
2) 确定是否满足优化原则---必要条件
3) 确定子问题的重叠性---估计算法效率
4) 列出关于优化函数的递推方程(或不等式)和边界条件
5) 自底向上计算子问题的优化函数值---非递归的算法
6) 备忘录方法记录中间结果
7) 标记函数追踪问题的解
问题:
1) 时间复杂性改进依赖于子问题的重叠程度
2) 空间复杂度较高
三、贪心算法
设计要素:
1)适用于满足优化原则的组合优化问题
2)将问题表示成多步判断
3)确定一个优化测度---贪心选择的依据
4)确定是否满足贪心选择性质---每步贪心选择都会导致最优解
5)自顶向下计算
贪心算法正确性的证明思路:
数学归纳法,叙述一个可以归纳证明的命题,并证明。
1) 对步数k归纳
对于任意k,k步贪心选择得到i1,i2,…,ik,那么存在最优解包含i1,i2,。。。,ik
2) 规模k归纳
对于任意k,贪心法得到关于规模为k的问题的最优解。
四、回溯法和分支估界法
适用于求解组合搜索和优化问题
求解条件:满足多米诺性质
解的表示:解向量,求解是不断扩充解向量的过程
回溯条件:
搜索问题---约束条件
优化问题---约束条件+代价函数
算法复杂性:
遍历搜索树的时间,最坏情况为指数,空间代价小
平均时间复杂性的估计:Monte Carlo方法
降低时间复杂性的主要途径:
利用对称性裁剪子树
划分成子问题
分支策略
深度优先、宽度有限、宽深结合、优先函数
五、求解组合优化问题的算法设计技术比较