1. edit distance
两个序列A与B,长度分别为n与m,通过增加删除或者修改的方式将A变成B, 其cost分别为c_I, c_D, c_R,找到总花费最低的方法
2. flow network: 一个有向图,每个边都有一个正数的容量,两个特殊的顶点分别为source与sink t,从s流向t
图像中由 通过的流量/最大容量表示
residual flow network:将原来的流量用一根与原方向相反的箭头标出,用(最大流量-原通过的流量)用一根和原来方向相同的箭头表示
augmenting path:一条在残量网络中从 (S) 到 (T) 的路径,路径上所有边的残留容量都为正。
(可以成功从水厂将水送到小区的一条路线)
augmenting path的最大通过量为瓶颈边的容量大小,即沿途过程中容量最低的
重新计算通过augmenting路径所有边的流量,如果通过增强路径的流量与原始流量的方向相同,则添加通过路径的额外流量,如果方向相反则减去,继而重新计算residual flow network
ford fulkerson method找最大流:尽可能增加 augmenting path,没有可加的augmenting path时即为最大流量
3. 证明可以找到最大流量:从中间切开,切口(S,T)的容量c(S, T)是离开S并进入T的所有边的容量之和,flow through a cut是从S到T的通过边的总流量减去从T到S的通过边的总流量
定理:流网络中的最大流量等于最小容量cut的容量
如果流量f等于某个切口的容量(S,T),则该流量必须最大,而该切口容量必须最小
4. Edmonds始终选择从源头s到接收器t的最短路径,其中最短路径意味着边的数量最少,可以在O(|V||E|)^2中运行
最快的算法是|V|^3
5. 如果有多个sources与sinks,添加super-sink与super-source,增加无限容量的边缘将她们分别连接到所有源和接收器上,可以将具有多个源和接收器的流网络简化成具有单个源和单个接收器的网络
6. maximum matching in biparitite graphs
图上的顶点可以分为两个子集L与R,使得每条边在两个集合中都各有一个端点
最大匹配问题可以转化为如何尽可能多的包含边的匹配
通过添加超级源与超级接收器,将所有边的容量设置为1,可以将最大匹配问题转化为最大流问题
7. 有时流程图的顶点也会有容量,这限制了到达顶点的流的总吞吐量
将具有有限容量的每个顶点v拆分成vin与vout两个顶点,两个顶点连接,将顶点的容量赋予这条边
8. string matching algorithms
Input:一段字符串t,和一个字符串p
Output:如果t中含有p,那么输出yes,如果没有,输出no
将字符串用hash function映射为一个个整数
8. 暴力匹配算法在经过一段匹配后,如果遇到匹配不成功的字符,则完全回溯,从开始匹配的下一个位置再进行字符匹配,过程中会有很多的无用功且耗时;
KMP算法就是利用之前判断过的信息,通过一个next数组,即部分匹配表,保存模式串中前后最长公共子序列的长度,每次回溯时,通过已经匹配到的位置,从部分匹配表中查找,确定已经匹配过的重合部分,直接移动主串的索引偏移到该位置,减少回溯,节省大量时间