首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Knuth-Morris-Pratt算法中的前缀函数计算

Knuth-Morris-Pratt算法中的前缀函数计算
EN

Stack Overflow用户
提问于 2015-05-23 07:11:19
回答 4查看 1.2K关注 0票数 2

所以对于下面的子字符串

代码语言:javascript
复制
1 2 3 4 5 6 7 8 9 10 11

a b c d a b c d a b  x

哪个是前缀函数?我和我的一个朋友计算了它,我们得到了不同的结果,我的是:

代码语言:javascript
复制
a b c d a b c d a b x

0 0 0 0 1 2 3 4 5 6 2

他的:

代码语言:javascript
复制
a b c d a b c d a b x

0 0 0 0 1 2 3 4 1 2 0

如果我错了,为什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-23 09:18:11

前缀表应该是:

代码语言:javascript
复制
a b c d a b c d a b x
0 0 0 0 1 2 3 4 5 6 0

所以给出的两个版本都不正确。

您的表的最后一项

代码语言:javascript
复制
a b c d a b c d a b x
0 0 0 0 1 2 3 4 5 6 2
                    ^
                    |
                this one

要正确,a b c d a b c d a b x的长度2(即b x )的后缀也必须是它的长度2前缀,即a b

如果前缀表中的条目与零不同,则在下表中标记了相应的前缀和后缀:

代码语言:javascript
复制
a                       0
a b                     0
a b c                   0
a b c d                 0

a  b c d a              1
-
         =
a b c d a b             2
---
        ===

a b c d a b c           3
-----
        =====

a b c d a b c d         4
-------
        =======

a b c d a b c d a       5
---------
        =========

a b c d a b c d a b     6
-----------
        ===========

a b c d a b c d a b  x   0
票数 1
EN

Stack Overflow用户

发布于 2015-05-23 09:02:58

我在java中的KMP函数:

代码语言:javascript
复制
public int[] KMP(String val) {
    int i = 0;
    int j = -1;
    int[] result = new int[val.length() + 1];
    result[0] = -1;
    while (i < val.length()) {
        while (j >= 0 && val.charAt(j) != val.charAt(i)) {
            j = result[j];
        }
        j++;
        i++;
        result[i] = j;
    }
    return result;

}

前缀数组的结果:

代码语言:javascript
复制
[-1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0]
票数 1
EN

Stack Overflow用户

发布于 2015-05-23 09:16:20

你们的回答都不正确。前缀函数或部分匹配表如下:

代码语言:javascript
复制
a b c d a b c d a b x

0 0 0 0 1 2 3 4 5 6 0

你的答案是正确的,直到指数10。但在上一个指数中,你做错了什么。部分匹配表的索引11的值将为0的原因是没有合适的前缀来匹配字符串的任何适当后缀,直到索引11。因为这个位置的所有适当后缀都将以x结尾,而在这个位置没有合适的前缀将以x结尾。

如果您有问题,理解什么实际上是前缀函数或部分索引表意味着您可以查看这个文档。有一个很好的解释。希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30410009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档