matlab数据结构与算法,基于MATLAB数据结构与算法_KMP.ppt

基于MATLAB数据结构与算法_KMP.ppt

学习动物精神 11、机智应变的猴子:工作的流程有时往往是一成不变的,新人的优势在于不了解既有的做法,而能创造出新的创意与点子。一味 地接受工作的交付, 只能学到工作方法 的皮毛,能思考应 变的人,才会学到 方法的精髓。 学习动物精神 12、善解人意的海豚:常常问自己:我是主管该怎么办才能有助于更好的处理事情的方法。在工作上善解人意, 会减轻主管、共 事者的负担,也 让你更具人缘。 基于MATLAB《数据结构与算法》 延边大学 信息管理专业(13级) 崔基哲 KMP模式匹配算法 MATLAB编程之基础算法 * 串的模式匹配算法 一、基本概念 1、模式匹配(定位) 设有主串S和子串T(将S称为目标串,将T称为模式串),在主串S中,从位置start开始查找,如若在主串S中找到一个与子串T相等的子串,则返回T的第一个字符在主串中的位置,否则返回-1。 2、算法目的 确定主串中所含子串第一次出现的位置(定位) 3、算法种类 KMP算法 KMP模式匹配算法 它是:在一个长字符串中匹配一个短子串的无回溯算法。 定义 s: 模式串 , m: 模式串的长度 text: 要匹配的字符串, n:text的长度 设text: x1,x2,…xn , s: a1,a2,…am, 则当存在i使 xi+k=ak(k=1,2,…m)时,认为text与模式串匹配,当然text也可能与模式串有多处匹配 例如:text: abcabca, s:abc 则text与s匹配的位置有3和6 KMP算法 作为一种无回溯的算法,它是高效的,待会儿你将看到它的时间复杂度为O(m+n),空间复杂度也为O(m+n) 而且,它很容易理解,代码也很短 定义 next: 为对应模式串的数组 设字符串为 s1s2s3...sm ,其中s1,s2,s3,... si,... sm均是字符,则next[i]=m,当且仅当满足如下条件:字符串s1s2...sm equals 字符串s(i-m+1)...si-1 si 并且s1s2...sm s(m+1) unequals s(i-m) s(i-m+1)...si-1 si。 通俗地讲,next[i]保存了以s[i]为结尾的后缀与模式串前缀的最长匹配数。 KMP算法的运行过程 我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。 如果a[i+1]==b[j+1],i和j各加1,什么时候j==m,就说B是A的子串(B串已经整完了) KMP算法的运行过程 如果a[i+1]!=b[j+1],这时候怎么办? i = 1 2 3 4 5 6 7 8 9 …… A = a b a b a b a a b a b … B = a b a b a c b j = 1 2 3 4 5 6 7 j=5时,a[i+1]!=b[j+1],我们要把j改成比它小的值j‘。改成多少合适呢? KMP算法的运行过程 i = 1 2 3 4 5 6 7 8 9 …… A = a b a b a b a a b a b … B = a b a b a c b j = 1 2 3 4 5 6 7 记住,我们要保持A[i-j+ 1..i]与B[1..j]完全相等,因而j’是最大的数使a[i-j’+1..i]与B[1..j’]完全相等. KMP算法的运行过程 i = 1 2 3 4 5 6 7 8 9 …… A = a b a b a b a a b a b … B = a b a b a c b j = 1 2 3 4 5 6 7 显然是求一个最长的以i为末尾的后缀要与B的前缀匹配。由于A[i-j+ 1..i]与B[1..j]完全相等,故令j’=next[j]即可保证此性质保留 KMP算法的运行过程 i = 1 2 3 4 5 6 7 8 9 …… A = a b a b a b a a b a b … B = a b a b a c b j = 1 2 3 4 5 6 7 i = 1 2 3 4 5 6 7 8 9 …… A = a b a b a b a a b a b … B = a b a b a c b j ‘= 1 2 3 4 5 6 7 KMP算法的运行过程 需要注意的是i并没有动,改变的只是j的值 如果改变j的值后a[i+1]仍不等于b[j+1]的话,继续改变j值直到a[i+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值