问题描述
我正在阅读有关Array.prototype.reduce()算法的信息,在网上发现的示例使用一维表来构建前缀信息表。
我还阅读了Sedgewick的解释,他使用2维数组构建表,并明确指出KMP的空间复杂度为O(RM)
,其中R
是字母大小,M
是字母大小。模式大小,而其他任何地方都指出空间复杂度仅为O(M + N)
,即要处理的文本和模式大小本身。
所以我对区别感到困惑。是否有多种KMP算法方法?他们有不同的范围吗?还是我想念什么?
如果一维也可以解决子串问题,为什么需要二维?
解决方法
我猜塞奇威克想证明KMP的一种变体,该变体以该术语的标准含义构造了确定性有限自动机。 (您观察到的)膨胀运行时间是一个很奇怪的选择,但是也许有一个令人信服的教学原因,我对此并不感激(然后我的博士学位是关于算法的,所以...)。我会发现另一个更符合原始说明的描述。