本文为记录鄙人因学习KMP长时间困扰的疑惑,以及这些疑惑解决的思路问题
学习KMP要先了解字符串查找的暴力算法中的显示回退实现
串查找的暴力算法中的显示回退实现
暴力匹配算法的缺点:
文本串:ABAAAABAAAAA 模式串ABAAAAA
例如给定文本串和模式串,我们发现 直到第(5次移动才找到),中间2、3、4次移动都是没必要的(一次移动并不是一次比较),很多时间浪费在这些无必要的中间过程中,是否有什么方法可以规避这些无效的匹配呢?
A B A A A A B A A A A A
—A B A A A A A (1)
---- A B A A A A A (2)
------ A B A A A A A (3)
-------- A B A A A A A (4)
---------- A B A A A A A (5)
KMP算法
KMP算法就是为了解决暴力算法中过多无效步骤的问题, 在前文的暴力算法的实现中,我们不管是双层for循环实现,还是显示回退算法,都用到了两个变量 文本串变量i、模式串变量j,i代表每次比较时文本串的字符串索引位,j代表的是模式串索引位,在回显实现中我们看到,每次比较完毕后,i和j都会回退,j每次都回退到0,因为下一轮的比较要拿模式串的首位去比较
那么问题来了,对于暴力查找,每下一轮的查找开始之前,i 都会往下走一位,而 j 都需要回退到0,所以,我们思考是不是可以省略些如此的过程呢?
KMP就是以此思想设计的,KMP实现:i不需要回退,j不需要回退到原始位
针对上图,我们以图中列出的两个问题作为起始点,首先,j前面的索引为什么不需要比较了?
找到最大相等前后缀后,该前后缀的长度,就是要下次要和i比较的模式串中字符的索引j的位置
字符串查找KMP算法java(理论篇)
最新推荐文章于 2023-07-08 20:31:01 发布