我想了解Knuth-Morris-Pratt算法的工作原理。我在普林斯顿大学https://www.youtube.com/watch?v=iZ93Unvxwtw看了这个教程。在这个视频中,他们使用一个表,字母表的长度=行数和模式的长度=列数。将表视为DFA,用于检测文本中的模式。我认为这种方法很有意思,但维基百科说Knuth-Morris-Pratt算法使用的前缀表只有一行代表前缀的长度。两种工作都是O(n + m)速度(n是文本的长度,m是模式的长度)。但DFA版本需要更多空间。但问题是真正的Knuth-Morris-Pratt算法,哪个是差异化?
答案 0 :(得分:3)
真实的(根据我所见过的最多定义)来自维基百科。将其实现为DFA的想法可能来自于Knuth-Morris-Pratt算法是Aho-Corasick自动机的特殊情况(它可以在trie上运行,而不仅仅是一个字符串),这通常以这种方式实现(因为前缀表不够用)。