知识点串的模式匹配
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主串s="ababcabcacbab",模式T="abcac"
主串s
模式串T ="abcac" 模式串T ="abcac"
模式串T ="abcac"
核心语句
if
(Se[2il]s0e=2={0Ti =/[8j]i)/-2j{+0+2+; i;j
++j; = 1;
} }
// 继续比较后继字符
i=6 返回值为11-5=6
∴t1≠s5
j
第 aba
6 趟
2020/8/20
bcab ca cb ab a b c a c 匹配成功
KMP模式匹配算法小结-1
(1)结论: i可以不回溯 ,模式向右滑动到的新比 较起点k ,并且k 仅与模 式串T有关!
2020/8/20
(1)模式滑动到第k个字符,有p1~pk-1 =Si-(k-1) ~ Si-1
第 aba b cabc a cbab
3 趟
2020/8/20
abc ac
KMP模式匹配算法图示-2
i
第 aba bca bcac ba b
3
趟
abc ac
i=7,j=5失败s4=t2;t1≠t2
∴t1≠s4
j
第 ab ab cabc acba b
4 趟
2020/8/20
abc ac
KMP模式匹配算法图示-3
(2)再观察失配时,有pj-(k-1) ~ pj-1 =Si-(k-1) ~ Si-1
两式联立可得:p1~pk-1=pj-(k-1) ~pj-1
i
S="a b a b c a a b c c b a b"
Si-(k-1)... si-1
j
p="a b c a a b a b c"
P1 --pk-1
Pj-(k-1)
i=11
b
J=6
算法4.5 Index(S,T,pos) 即模式匹配的特点:
特点一: Index(S,T,pos) 算法的匹配方法简单,理解方便,适合一些文本编辑,效 率较高;
特点二: Index(S,T,pos) 算法的匹配方法简单,理解方便,适合一些文本编辑,效 率较高;正常情况下,时间复杂度为O(M+N);
KMP算法优点:可以在O(M+N)的时间复杂度内完成模式匹配操作,即对 Index(S,T,pos)模式匹配算法的改进,取消了主串的回溯 。
KMP算法基本思想:每当匹 20配20/8/2过0 程中出现字符比较不
KMP模式匹配算法图示-1
i
第 aba bc abcac bab
1
趟 abc ac
j
i=3,j=3时,失败即 s3 ≠ t3 ;; S1=t1 ; s2=t2; 因为t1≠t2;所以t1≠s2
Pj-1
当 si ≠ pj失匹时
2020/8/20
小结-2
关注部分匹配时的重要特征——
i
S="ap=b"aa
b b
c c
a a
a a
b b
cc b a a b c"
b"
j
i
S="a b a b cpa="aabbcccabca"b"
特点 三: 如果主串和子串存在多个零时,如: S=‘0000…1’{总共52个零};T=‘00000001’, 则出现多次重复的比较,即出现不等时, I 指针每次都回朔到i-1位置,这样 浪费了大量的比较时间,整个匹配需要回朔45次,While循环语句的执行次 数为46*8(index*m).
2020/8/20
算法4.5 Index(S,T,pos) 即模式匹配的时间复杂性分析 因为Index(S,T,pos)是一种有回溯的模式匹配算法 ; 所以,在最坏情况下的时间复杂度是O(n*m)。
2020/8/20
• 4. 3.2 模式匹配的一种改进算法
模式匹配的一种改进算法是D.E.Knuth 与V.R.Pratt和J.H.Morris同时发现的, 因此,称该算法为克努特-莫里斯-普拉特算法(简称为KMP算法)。在串匹 配算法中又称 KMP模式匹配算法。
2020/8/20
p79算法4.5
int Index (SString S, SString T, int pos) { // 返回子串T在主串S中第pos个字符之后的位置。若不存在,
// 则函数值为0。其中,T非空,1≤pos≤StrLength(S)。 i = pos; j = 1; while (i <= S[0] && j <= T[0]) { if (S[i] == T[j]) { ++i; ++j; } // 继续比较后继字符 else { i = i-j+2; j = 1; } // 指针后退重新开始匹配 } if (j > T[0]) return i-T[0]; else return 0; } // 2In0d2e0x/8/20
这是串的一种重要操作,很多软件,若有“编辑”菜单 项的话,则其中必有“查找”子菜单项。
2020/8/20
• 4. 3.1 求子串位置的定位函数 Index(S,T,pos)
Index(S,T,pos)称为模式匹配(S为主串, T为模式串 ); 初始条件:S和T存在,T是非空串, 1 <= pos <= (S的长度)。 操作结果:若主串S中存在和串T相同的(模式串 )子串,则返回它在 主串S中第pos个字符之后第一次出现的位置;否则返回0。
i
第 ababcabcacbab
3
趟
abc ac
i=7,j=5失败s5=t3;t1≠t3
∴t1≠s5
j
第 aba
5 趟
2020/8/20
bc a bcacba b abc a c
KMP模式匹配算法图示-4
i
第 ab abca bcac bab
3
趟
ab cac
i=7,j=5失败s5=t3;t1≠t3
• 4. 3 串的模式匹配算法( 知识点三) • 子串定位运算又称为模式匹配或串匹配,此运算的应
用非常广泛。例如,文本编辑程序中,经常要查找某 一特定单词出现的位置。解此问题的有效算法能极大 地提高文本编辑程序的响应性能。 串的模式匹配定义:在主串中寻找子串在串中的位置。 在模式匹配中,子串称为模式串,主串称为目标串。
例如:对某文本进行编辑时,可以运用如下步骤: (1)编辑;(2)查找 ——“输入查找文本(字符串)”;(3)找出对应 的串
2020/8/20
T串
defghijk
pos=4
Abcdefghijklmnopqrstuvw
S串
按照上述主串S和子串T求子串位置的定位函数 Index(S,T,pos)的返回值是4