KMP算法ppt课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 显然两者互不相干。也就是说,仅移动 一次不一定满足pk2=pj 。
• 如果移动一次后得到k2仍然不满足pk2=pj , 就要按照前提条件再移动一次。
• 依次类推,直到pkn=pj ,或kn=0为止。
• 此时有: next[j+1]= kn +1
•而
kn = next[kn-1]

k1 =k= next[j]
算法描述:
从正文s和模式p的第一个字符出发,将s 和p的字符依次逐个进行比较,如果p中 的所有字符均与s中的对应字符匹配,则 说明匹配成功;如果在比较过程中发现 了一个字符不匹配,则将模式p沿正文s 向后移动一个字符的位置,然后再从p的 第一个字符开始与中的对应字符逐个进 行比较。以此类推,直到匹配成功或到 达的末段为止。
3
模式匹配的KMP算法
基本思想: 当模式p与正文s进行比较的过程中发现
不匹配时,找到一种模式p沿正文s向后 移动的规则,以便使得正文s中失去匹配 的字符以前的字符不再参与比较,即只 从当前失去匹配的字符开始与模式p中的 字符继续依次进行比较,并且又不错过 模式被发现的机会。 示例:
4
算法分析
2
(2) Brute-Force算法的实现
int String::Find Substr(const String& t, int start)const {
int i = start, j = 0, v; while(i < size && j < t.size) {
if(str[i] == t.str[j]) {i++;j++;} else {i = i-j+1;j = 0;} } if(j >= t.size-1) v = i-t.size+1; else v = -1; return v; }
第四章 字符串模式匹配算法
什么是模式匹配? 在一般的编辑软件中,经常要遇到在一
个给定的文本中查找一个特定的字符串 的问题,这就是字符串匹配,也称模式 匹配。 设P是一个模式字符串(简称模式),其长 度为m;s是一个正文字符串(简称正文), 其长度为n。通常认为n>>m
1
简单算法(Brute-Force算法)
10
有两种可能情况
1、若pk=pj,则表明‘p0p1……pk’ = ‘满p足j-k上pj-式k+1,…那…么pj’,并且不可能存在k’>k

k next[j+1]= +1
式1
也就是:next[j+1]=next[j]+1
2‘、p若j-kppj-kk!+=1…pj,…则pj’表明‘p0p1……pk’ ! =
5
假设此时应与模式中第k个字符继续比较,其 中k应具有以下两个性质:
1、k<j,因为当失配时必然使模式p向后移, 从而导致k<j。移的幅度越小,k与j相差越小。
2、k应取所有可能值中的最大值,因为取最大 值就意味着移的幅度最小,也就避免错过成功 匹配的机会。
根据这个假设,必然使得下式成立:
12
k2,到底是多少首先取决于另一个前提条件:
‘p0p1……pk2-1’= ‘pj-k2pj-k2+1……pj-1’
如图:
0 j-k+1
j
p1
k- k2 +1
j p2
0
k
j p3
0
k2 k
实际上,

k2=next[k]
13
• 那么,满足了这个前提条件,是否就满 足pk2=pj了呢?
‘p0p1……pk-1’=‘si-ksi-k+1……si-1’
(1)
而已经得到的“部分匹配”的结果是:
‘pj-kpj-k+1……pj-1’=‘si-ksi-k+1……si-1’

(2)
6
(2)式的由来是:
当初正文中的第i个字符与模式中的第 j个字符失配时,说明两者之前的j个字符 肯定是一样的,而k<j,所以前k个字符也 是相同的。这就得出(2)式。
利用next数组进行模式匹配示例:
9
如何预先求得next数组值
首先要明确一点: next数组的求值只与 模式p有关,而与具体的正文s无关。
我们可用递推的方法求next数组值。 假设已求得next[j]=k,根据定义可得 ‘p0p2……pk-1’= ‘pj-kpj-k+1……pj-1’ 那么next[j+1]=?
并令next[j]=k。
Next数组的完整定义如下:
-1 当j=0时;
next[j]=
Max{ k | 0<k<j 且‘p0p2……pk-1’= ‘pjkpj-k+1……pj-1’ } 当此集合不为空时
0 其他情况
8
Next[0]=-1表示当模式p的第0个字符失去 匹配时应将p沿正文方向右移一个位置, 也即使p的第一个字符与正文s的下一个 字符进行比较。
由(1)(2)两式便可得:
‘p0p1……pk-1’= ‘pj-kpj-k+1……pj-1’ (3)
(3)式的结论可如下描述:
在模式p中,前k个字符与第j个字符之前 的k个字符相同。
7
设next[j]表示:当模式中第j个字符与正 文中相应字符“失配”时,在模式中重 新和正文中该字符进行比较的字符的位 置。
14
由于, kn < kn-1 <……< k1 =k<j 因此,当需要求next[j+1]时, next[j]、
next[k1]、 next[k2]…… next[kn]都已经求 出来了。
15
? 这时如何求next[j+1]呢
11
转化法
式1的结论可这样描述:何时的k使得
pk=pj,就用此时的k代入式1。
而现在的k是pk!=pj,因此必须要换成另外 一个“k”,并设它为k2,以使得pk2=pj。
问题又出来了: k2如何得来?
如图: 0 j-k+1
ຫໍສະໝຸດ Baidu
j
P’
P
0
kj
要使得k转为k2,实际上就是将p往右移,移动 后p’的j对应p的k2。
假设正文为‘s0s1……sn-1’,模式为 ‘p0p1……pm-1’,要实现改进算法,也 就是要解决下述问题:当匹配过程中产 生失配时(即si != pj),模式“向右滑动” 可行的距离有多远,换句话说,当正文 中第i个字符与模式中第j个字符“失配” 时,正文中第i个字符应与模式中哪个字 符相比较?
相关文档
最新文档