模式匹配KMP算法
注:文中均为伪代码。主要是展示算法思想和实现方式
算法要求给定主串 S 和子串 T,要求返回 T 在 S 中第一次出现的位置,若不存在,返回 -1;
暴力匹配以 S 的第 1 个字符为起点,逐个与 T 中字符比较,若匹配失败,起点向前进一位,即第二次匹配从第 2 个字符开始。直至匹配成功或无法匹配。
代码示例:
12345678910111213141516int Index(String s, String t, int pos) { int k = 0, j = 0; while (k < s.length && j < t.length) { if (s[k] == t[j]) { k++; j++; } else { k = k - j + 1; //k-j为当前起点位置,+1为下次匹配起点 j = 0; } } ...
Dijkstra算法
抽象定义输入:加权图 $G=(V(G),E(G)),\ w:E(G)\rightarrow \mathbf{R}^+$,顶点 $u_0\in V(G)$
输出:$u_0$ 到其余所有顶点的最短路径和对应距离
集合S用来存储已经找到的最短路径,l记录路径终点的前导节点
任给 $u,v\in V(G)$,若 $u,v\notin E(G)$,令 $w(uv)=\infty$
令 $d(u_0)=0,\ l(u_0)=u_0$; 任给 $u \in V(G),\ u \neq u_0,\ d(u)=\infty,\quad l(u)=*$; $S_0=\left\{u_0\right\};\ i=0$
对任给 $u\in V(G)-S_i$,若 $d(u_i)+w(u_iu)<d(u)$,则令 $d(u)=d(u_i)+w(u_iu),\ l(u)=u_i$
选出 $u_{i+1}\in V(G)-S_i$,使得 $d(u_{i+1})=min_{u\in V(G)-S_i}d(u)$,令 $S_{i+1}=S_i\cup{u_{i+1}}$
若 $i=v(G)-1$,算法停止;否则 ...
