版权声明:谢谢 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算法。
除此之外,可能还有需要改进的原因,继续,去探索。
嘻嘻,我的小米衣服快到了