开发者社区> 问答> 正文

kmp算法的基本思想

kmp算法的基本思想

展开
收起
知与谁同 2018-07-22 13:02:41 2511 0
2 条回答
写回答
取消 提交回答
  • 你nupt的。 563819740,男仔囡幼
    2019-07-17 22:55:51
    赞同 展开评论 打赏
  • 这个时候,玄酱是不是应该说点什么...

    主串:a b a c a a b a c a b a c a b a a b b,下文中我们称作T
    模式串:a b a c a b,下文中我们称作W
    在暴力字符串匹配过程中,我们会从T[0] 跟 W[0] 匹配,如果相等则匹配下一个字符,直到出现不相等的情况,此时我们会简单的丢弃前面的匹配信息,然后从T[1] 跟 W[0]匹配,循环进行,直到主串结束,或者出现匹配的情况。这种简单的丢弃前面的匹配信息,造成了极大的浪费和低下的匹配效率。
    然而,在KMP算法中,对于每一个模式串我们会事先计算出模式串的内部匹配信息,在匹配失败时最大的移动模式串,以减少匹配次数。
    比如,在简单的一次匹配失败后,我们会想将模式串尽量的右移和主串进行匹配。右移的距离在KMP算法中是如此计算的:在已经匹配的模式串子串中,找出最长的相同的前缀和后缀,然后移动使它们重叠。
    在第一次匹配过程中
    T: a b a c a a b a c a b a c a b a a b b
    W: a b a c ab
    在T[5]与W[5]出现了不匹配,而T[0]~T[4]是匹配的,现在T[0]~T[4]就是上文中说的已经匹配的模式串子串,现在移动找出最长的相同的前缀和后缀并使他们重叠:
    T: a b a c aab a c a b a c a b a a b b
    W: a b a c ab
    然后在从上次匹配失败的地方进行匹配,这样就减少了匹配次数,增加了效率。
    然而,有些同学可能会问了,每次都要计算最长的相同的前缀会不会反而浪费了时间,对于模式串来说,我们会提前计算出每个匹配失败的位置应该移动的距离,花费的时间是常数时间。比如: j  012345W[j]  a  bacabF(j)00  1012当W[j]与T[i]不匹配的时候,设置j = F(j-1)
    文献中,朱洪对KMP算法作了修改,他修改了KMP算法中的next函数,即求next函数时不但要求W[1,next(j)-1]=W[j-(next(j)-1),j-1],而且要求W[next(j)]<>W[j],他记修改后的next函数为newnext。显然在模式串字符重复高的情况下,朱洪的KMP算法比KMP算法更加有效。
    以下给出朱洪的改进KMP算法和next函数和newnext函数的计算算法。

    2019-07-17 22:55:51
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载