KMP:
将待匹配字符串与原字符串进行比较:
最原始的做法,从字符的头开始比较,首字符匹配,接着匹配第二个字符,若不匹配,后移一个字符,从首字符开始重新匹配。这实际上是一种蛮力搜索匹配,搜索空间比较到。一种改进额算法,在字符不匹配时,不是只移动一位,而是通过移动如下的位数,来减少一些不必要的匹配过程。移动位数的确定如下式:
移动位数 = 已匹配的字符数 - 对应的部分匹配值
《部分匹配表》是如何产生的。
首先,要了解两个概念:”前缀”和”后缀”。 “前缀”指除了最后一个字符以外,一个字符串的全部头部组合;”后缀”指除了第一个字符以外,一个字符串的全部尾部组合。
“部分匹配值”就是”前缀”和”后缀”的最长的共有元素的长度。以”ABCDABD”为例,
- “A”的前缀和后缀都为空集,共有元素的长度为0;
- “AB”的前缀为[A],后缀为[B],共有元素的长度为0;
- “ABC”的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;
- “ABCD”的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;
- “ABCDA”的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为”A”,长度为1;
- “ABCDAB”的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为”AB”,长度为2;
- “ABCDABD”的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。
详细的一个例子可以参看:
http://kb.cnblogs.com/page/176818/
本文深入解析KMP算法的核心概念,包括部分匹配表的生成原理和应用,阐述如何通过该算法优化字符串匹配过程,显著减少不必要的匹配操作,提升搜索效率。
1672

被折叠的 条评论
为什么被折叠?



