编辑“︁
KMP算法
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
===创建表算法示例=== 以<code>W = "ABCDABD"</code>为例。以下将看到,部分匹配表的生成过程与前述查找过程大同小异,且出于类似原因是高效的。 首先,设定<code>T[0] = -1</code>。为求出<code>T[1]</code>,必须找到一个<code>"A"</code>的[[子串|真后缀]](真后缀指不等于原串的后缀)兼<code>W</code>的前缀。但<code>"A"</code>没有真后缀,所以设定<code>T[1] = 0</code>。类似地,<code>T[2] = 0</code>。 继续到<code>T[3]</code>,注意到检查'''所有'''后缀有一个捷径:假设存在符合条件的前后缀,两者分别为<code>W[0..1] = W[1..2]</code>,则必有<code>W[0..0] = W[1..1]</code>。由于<code>W[0..0]</code>亦是<code>W</code>的真前缀,上一步必然已经得到<code>T[2] = 1</code>(而有<code>T[2] = 0</code>,说明假设不成立)。一般地,遍历到每个字符时,只有上一步已经发现一个长为m的有效后缀,才需要判断有无长为m+1的后缀,而毋需考虑长为m+2、m+3等的后缀。 从而,不必考虑长为2的后缀,而唯独需要考虑的长度1亦不可行,故得到<code>T[3]=0</code>。 接下来是<code>W[4] = 'A'</code>。基于同样的理由,需要考虑的最大长度为1,并且在<code>'A'</code>这个情况中有效,回退到寻找的当前字符''之前''的字段,因此<code>T[4] = 0</code>。 现在考虑下一个字符<code>W[5] = 'B'</code>,使用这样的逻辑:如果曾发现一个子模式在上一个字符<code>W[4]</code>之前出现,继续到当前字符<code>W[5]</code>,那么在它之前它本身会拥有一个结束于<code>W[4]</code>合适的初始段,与事实相反的是已经找到<code>'A'</code>是最早出现在结束于<code>W[4]</code>的合适字段。因此为了找到<code>W[5]</code>的终止串,不需要查看<code>W[4]</code>。因此<code>T[5] = 1</code>。 最后到<code>W[4] = 'A'</code>。下一个字符是<code>'B'</code>,并且这也确实是<code>W[5]</code>。此外,上面的相同参数说明为了查找<code>W[6]</code>的字段,不需要向前查看<code>W[4]</code>,所以得出<code>T[6] = 2</code>。 于是得到下面的表: {| class="wikitable" style="background-color:white; font-family:monospace; text-align:right" !<code>i</code> | 0 | 1 | 2 | 3 | 4 | 5 | 6 |- !<code>W[i]</code> | A | B | C | D | A | B | D |- !<code>T[i+1]</code> | 0 | 0 | 0 | 0 | 1 | 2 | 0 |} 另一个更复杂和有趣的例子: {| class="wikitable" style="background-color:white; font-family:monospace; text-align:right" !<code>i</code> | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |- !<code>W[i]</code> | P | A | R | T | I | C | I | P | A | T | E | | I | N | | P | A | R | A | C | H | U | T | E |- !<code>T[i+1]</code> | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |}
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息