- 4
- 0
- 约1.31万字
- 约 45页
- 2018-11-28 发布于广西
- 举报
* * * * * * * * * * * KMP算法 KMP—Knuth, Morris, Pratt三人发明 特点 无需回溯 在O(n+m)的时间量级上完成串的模式匹配操作 KMP算法 假设主串S为’s1s2s3…sn’,模式串T为’p1p2…Pm’,若si与Pj发生失配,则有: ’si-j+1…si-1’=’p1…pj-1’ (1) 由(1),若kj,则有: ’ si-k+1…si-1’= ’pj-k+1…pj-1’ (3) 若主串不回溯,设此时将模式串中第k(k<j)个字符继续比较,则有:: ’si-k+1…si-1’= ’p1…pk-1’ (2) 由(2)和(3),则下式成立: ’p1…pk-1’ ==’pj-k+1…pj-1’ (4) 该等式只与模式串有关,与主串无关。 若模式串P为’ abaabc’,由定义可得next函数值 j 1 2 3 4 5 6 模式串 a b a a b c next[j] -1 0 0 1 1 2 KMP算法 next函数的定义 ↓i=2 第一趟匹配: 主串 a c a b a a b a a b c a c a a b c 模式串 a b ↑j=2 next[2]=0 ↓i=2 第二趟匹配: 主串 a c a b a a b a a b c a c a a b c 模式串 a ↑j=1 next[1]=-1? ↓i=3 → ↓i=8 第三趟匹配: 主串 a c a b a a b a a b c a c a a b c 模式串 a b a a b c ↑j=1 → ↑j=6 next[6]=2 ↓i=8 → ↓i=12 第四趟匹配: 主串 a c a b a a b a a b c a c a a b c 模式串 (a b) a a b c ↑j=3 → ↑j=7 KMP算法手工模拟 主串 S=‘a c a b a a b a a b c a c a a b c’ 模式串 P=’a b a a b c’ -1 0 1 2 0 0 1 2 0 -1 0 0 0 1 2 3 4 0 j 1 2 3 4 5 6 7 8 9 模式串 a a a b c a a b a j 1 2 3 4 5 6 7 8 9 模式串 a b c a b c a c b 求模式串的next函数值举例 * 用KMP算法实现的快速匹配算法 int AString::fastFind(AString pat, int k, int next[]) const { //从 k 开始寻找 pat 在 this 串中匹配的位置。若找 //到,函数返回 pat 在 this 串中开始位置,否则函 //数返回-1。数组next[ ] 存放 pat 的next[j] 值。 int posP = 0, posT = k; //两个串的扫描指针 int
原创力文档

文档评论(0)