Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm KMP算法最坏情况分析_Algorithm_Time Complexity_String Search_Knuth Morris Pratt - Fatal编程技术网

Algorithm KMP算法最坏情况分析

Algorithm KMP算法最坏情况分析,algorithm,time-complexity,string-search,knuth-morris-pratt,Algorithm,Time Complexity,String Search,Knuth Morris Pratt,我不明白国民党是如何维持O(m+n)的。我在找“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 图案:AAB(长度n) 字符串:aaaaaaaaaa。。。(长度m) 那么前缀表将是 aaaab 01230 每次“b”上发生不匹配时,其前缀长度始终为0。因此,模式只向

我不明白国民党是如何维持O(m+n)的。我在找“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

  • 图案:AAB(长度n)
  • 字符串:aaaaaaaaaa。。。(长度m)
那么前缀表将是

aaaab

01230

每次“b”上发生不匹配时,其前缀长度始终为0。因此,模式只向右移了一步

aaaaaaaaaa

aaaab

aaaaaaaaaa

_aaaab

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

__aaaab

对于每个试验,我需要比较完整的n次,因为不匹配发生在最后一个“b”。因此,它仍然需要O(m*n)比较


谁能给我解释一下KMP是如何得到O(m+n)的?提前感谢。

诀窍在于,当遇到不匹配时,不要只将字符串中的位置提前1个字符。KMP旨在避免这样做。在您的示例中,不匹配发生在连续4次匹配a之后。这4个a中没有b,因此可以将字符串中的搜索位置提前4,而不是1。你继续这样做,最终得到O(m)

为了使所有这些都起作用,KMP使用该模式预计算助手表。此表基本上会告诉您,对于模式中给定位置发生的不匹配,字符串中的位置要前进多少。结果表明,该表也是以线性时间O(n)构建的


有关示例、详细信息和(伪)代码,请参见wikipedia和其他地方。

诀窍在于,当遇到不匹配时,不要将字符串中的位置提前1个字符。KMP旨在避免这样做。在您的示例中,不匹配发生在连续4次匹配a之后。这4个a中没有b,因此可以将字符串中的搜索位置提前4,而不是1。你继续这样做,最终得到O(m)

为了使所有这些都起作用,KMP使用该模式预计算助手表。此表基本上会告诉您,对于模式中给定位置发生的不匹配,字符串中的位置要前进多少。结果表明,该表也是以线性时间O(n)构建的

有关示例、详细信息和(伪)代码,请参见wikipedia和其他地方