KMP 算法详解:模式串匹配与比较次数统计
首先,我们来计算模式串的 next 函数。
模式串:'a b a b a c'
首先,next[0] = -1,表示模式串的第一个字符无法与其他字符形成最长公共前后缀。
对于模式串的每个字符,我们需要找到它之前的最长公共前后缀的长度。
next[1] = 0,表示模式串的第二个字符与第一个字符无法形成最长公共前后缀。
next[2] = 1,表示模式串的第三个字符与第二个字符形成的最长公共前后缀的长度为1。
next[3] = 2,表示模式串的第四个字符与第三个字符形成的最长公共前后缀的长度为2。
next[4] = 3,表示模式串的第五个字符与第四个字符形成的最长公共前后缀的长度为3。
next[5] = 0,表示模式串的第六个字符与第一个字符无法形成最长公共前后缀。
因此,模式串的 next 函数为:[-1, 0, 1, 2, 3, 0]。
接下来,我们使用 KMP 算法进行匹配过程,并统计比较的次数。
给定的主串为:'a b a a b a b a a b a b a b a c a'
模式串为:'a b a b a c'
首先,我们将模式串与主串的第一个字符进行比较。
模式串的第一个字符 'a' 与主串的第一个字符 'a' 相等,继续比较下一个字符。
模式串的第二个字符 'b' 与主串的第二个字符 'b' 相等,继续比较下一个字符。
模式串的第三个字符 'a' 与主串的第三个字符 'a' 相等,继续比较下一个字符。
模式串的第四个字符 'b' 与主串的第四个字符 'a' 不相等。根据模式串的 next 函数,我们将模式串向右移动 2 位。
模式串的第一个字符 'a' 与主串的第四个字符 'a' 相等,继续比较下一个字符。
模式串的第二个字符 'b' 与主串的第五个字符 'b' 相等,继续比较下一个字符。
模式串的第三个字符 'a' 与主串的第六个字符 'a' 相等,继续比较下一个字符。
模式串的第四个字符 'b' 与主串的第七个字符 'b' 相等,继续比较下一个字符。
模式串的第五个字符 'a' 与主串的第八个字符 'a' 相等,继续比较下一个字符。
模式串的第六个字符 'c' 与主串的第九个字符 'b' 不相等。根据模式串的 next 函数,我们将模式串向右移动 3 位。
模式串的第一个字符 'a' 与主串的第九个字符 'a' 相等,继续比较下一个字符。
模式串的第二个字符 'b' 与主串的第十个字符 'a' 不相等。根据模式串的 next 函数,我们将模式串向右移动 0 位。
模式串的第一个字符 'a' 与主串的第十个字符 'a' 相等,继续比较下一个字符。
模式串的第二个字符 'b' 与主串的第十一个字符 'b' 相等,继续比较下一个字符。
模式串的第三个字符 'a' 与主串的第十二个字符 'a' 相等,继续比较下一个字符。
模式串的第四个字符 'b' 与主串的第十三个字符 'b' 相等,继续比较下一个字符。
模式串的第五个字符 'a' 与主串的第十四个字符 'a' 相等,继续比较下一个字符。
模式串的第六个字符 'c' 与主串的第十五个字符 'c' 相等。
匹配完成,模式串在主串中的位置为索引 9。
根据上述过程,比较的次数为 15 次。
原文地址: https://www.cveoy.top/t/topic/bEDI 著作权归作者所有。请勿转载和采集!