算法是为了求解问题而给出的指令序列
正确性:对于符合输入类型的任意输入数据,都能产生正确的输出
有效性:每一步指令能够被有效的执行,并且规定了指令的执行效果和结果应该具有的数据类型,而且是可以预期的
确定性:每一步之后都要有确定的下一步指令
有穷性:在有限步内结束
分治法
- 将一个问题分割成几个规模小、性质相同、独立的子问题
- 通常通过递归方法解决子问题
- 合并每个子问题的解得到整个问题的解
动态规划
子问题非独立:子问题求解依赖其子问题的解
- 描述最优解的结构特征
- 定义最优解决方案的递归形式
- 以自底向上的方式计算最优解决方案的值
- 从计算信息构造出最优解决方案
01背包
P(i,w)=max{vi+P(i−1,w−wi),P(i−1,w)}从1挑到i,背包容量为w
矩阵链相乘
m[i,j]=⎩⎨⎧0i≤k≤jmin{m[i,k]+m[k+1,j]+Pi−1PkPj}if i=jif i<j
最长公共子序列
c[i,j]=⎩⎨⎧0c[i−1,j−1]+1max(c[i,j−1],c[i−1,j])if i=0 or j=0if xi=yj , i,j>0if xi=yj , i,j>0
装配线排程
f∗=min(f1[n]+x1,f2[n]+x2)f1[j]={e1+a1,1min(f1[j−1]+a1,j,f2[j−1]+t2,j−1+a1,j)if j=1if j≥2f2[j]={e2+a2,1min(f2[j−1]+a2,j,f1[j−1]+t1,j−1+a2,j)if j=1if j≥2
贪婪算法
- 首先作出贪婪选择
- 求解贪婪选择后产生的唯一子问题
- 后续贪婪选择与前面的选择有关,但与子问题的解无关
- 自顶向下,问题规模逐步缩小
论证贪婪算法的正确性:用反证法:假设存在一个更优解…
最短路径
单源最短路径
- Bellan-Ford:遍历所有边∣V−1∣次,每次对每条边执行一次缩短运算
- DAG(有向无环图):先对图进行拓扑排序,依照拓扑序,对于每一个顶点,对始于该顶点的每条边进行缩短操作
- Dijkstra(不能有负权边):每次从剩余顶点的集合Q=V−S中选择当前具有最短距离的顶点加入到S,对始于该顶点的每条边进行缩短操作(第一次选择源点)
全成对最短路径
-
APSP
lij(m)=1≤k≤nmin{lik(m−1)+wkj}
-
Floyd-Warshall
dij(k)={wijmin{dij(k−1),dik(k−1)+dkj(k−1)}if k=0if k≥1