【KMP算法改进】C++

版权声明:谢谢 https://blog.csdn.net/Waybyway/article/details/83832251

mark明天来和顺便描述一下原本kmp,

kmp和bf算法 在文本串 i=0时匹配就成功的话基本相同,且bf不用计算next数组,、

然而bf算法,如果匹配失败,会从i=1,i=2,逐个逐个的匹配,浪费时间

kmp算法,在发现匹配失败的时候,文本串匹配失败位置前面的字符串是匹配好的,这一段同样会出现在模式串同样位置上,kmp算法会查模式串匹配失败位置处的next数组值,鉴于前缀后缀相同的原因,让模式串含有前缀的地方和文本串含有后缀的地方重合在一起,进行下一次匹配。提高效率。

然而有几个问题。

1,假设kmp算法在i=0处就匹配失败怎么办。

i=0处,失败,i=1,重新匹配

next数组为 -1,所以 j=-1,i=0 进入if语句,++j  ,  j=0,++i,i=1,text[  1  ] 和 patten[   0  ],继续匹配,

i=1,在失败,i=2 ,重新匹配

可见如果刚开始就匹配失败,没有体现kmp算法优点,kmp算法优点在于某次匹配失败后,还能让尽可能相同的部分相匹配,跳过不可能的地方。

2,假设文本串为 a a a b a a a a b,模式串为a a a a b。

如果未改进就会在第一次匹配i=0,下 在i=3,j=3,失败

然后 i3 / j2, i3 / j 1,i3 / j0.连续匹配失败好多次,跳出i3后 到 i4 /j0  才成功,因此还需改进kmp算法。

除此之外,可能还有需要改进的原因,继续,去探索。

嘻嘻,我的小米衣服快到了

猜你喜欢

转载自blog.csdn.net/Waybyway/article/details/83832251