Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
String 是否存在具有不同空间复杂性的多个KMP算法方法?有什么区别?_String_Algorithm_Substring_Space Complexity_Knuth Morris Pratt - Fatal编程技术网

String 是否存在具有不同空间复杂性的多个KMP算法方法?有什么区别?

String 是否存在具有不同空间复杂性的多个KMP算法方法?有什么区别?,string,algorithm,substring,space-complexity,knuth-morris-pratt,String,Algorithm,Substring,Space Complexity,Knuth Morris Pratt,我正在阅读有关算法和我在网上找到的示例的信息。使用一维表来构建前缀信息表。 我还阅读了Sedgewick的解释,他使用了一个二维数组来构建表,并明确指出KMP的空间复杂度是O(RM),其中R是字母表大小,M是模式大小,而其他地方都说空间复杂度只是O(M+N)即要处理的文本和图案大小本身。 因此,我对这种差异感到困惑。有多种KMP算法方法吗?它们有不同的范围吗?或者我错过了什么? 如果1D也能解决子串问题,为什么还需要2D?我想Sedgewick想展示KMP的一个变体,它构造了一个标准意义上的确定

我正在阅读有关算法和我在网上找到的示例的信息。使用一维表来构建前缀信息表。
我还阅读了Sedgewick的解释,他使用了一个二维数组来构建表,并明确指出KMP的空间复杂度是
O(RM)
,其中
R
是字母表大小,
M
是模式大小,而其他地方都说空间复杂度只是
O(M+N)
即要处理的文本和图案大小本身。
因此,我对这种差异感到困惑。有多种KMP算法方法吗?它们有不同的范围吗?或者我错过了什么?

如果1D也能解决子串问题,为什么还需要2D?

我想Sedgewick想展示KMP的一个变体,它构造了一个标准意义上的确定性有限自动机。这是一个奇怪的选择,(正如你所观察到的)会增加运行时间,但可能有一个令人信服的教学原因,我不欣赏(然后我的博士学位是关于算法的,所以…)。我会找到另一个更接近原始描述的描述。

是的,他确实使用了DFA的模拟,描述相当复杂。有时,我失去了他的观点,不确定字母表中包含的所有字符是否是这个问题的一般解决方案(因为他实际上说有一个更节省空间的版本KMP使用NFA!)。因此,在非学术环境中,仅在模式上使用一维数组的“简单”方法可以很好地工作,对吗?他提到的NFA方法不是我在其他示例中看到的一维方法,对吗?@Jim我记得的标准版本是,通过搜索模式中的模式来构建1D表,以便给定模式的任何前缀,您可以找到作为模式前缀的最大后缀。然后在搜索的每个步骤中,您要么成功地扩展匹配,要么将模式滑到上面。我相信你可以眯着眼睛,把它看作是NFA,但我不同意这是一个富有成效的观点,除了观察KMP是如何从模式匹配文献中现有的结果中推导出他们的算法。如果你也能在这里看一下,你会不会很感激?