串的顺序存储结构-KMP匹配算法-nextvalue数组的计算
private void getNextval(StringList T, int[] nextval) {

    int i, j;   //代表第几个字符
    i = 1;
    j = 0;
    nextval[1] = 0;
    for (i=2; i < nextval.Length; i++)
    {
        while (j > 0 && T[i] != T[j + 1])
        {
            j = nextval[j];
        }
        if (T[i] == T[j + 1])
        {
            j++;
        }
        nextval[i] = j;
    }

}


这里计算的就是匹配串的前index(包括index)的字符串的最长前后缀相同的字符个数

例如:ababaaaba,那么

"a",next[1] = 0

"ab",next[2] = 0

"aba",next[3] = 1

"abab",next[4] = 2

"ababa",next[5] = 3

"ababaa",next[6] = 1

"ababaaa",next[7] = 1

"ababaaab",next[8] = 2

"ababaaaba",next[9] = 3

这个数组的作用就是,比如说:你在主串ababatabssss中匹配ababaaaba,你会发现前面5个字符都是一样的,就是第5+1个不一样

普通的匹配模式,主串会从第二个开始ababaaabssss,而匹配串从头开始ababaaaba

但是因为有next数组的存在,next[5]的存在,匹配串回到next[5]=3,然后主串位置不变,比较第3+1

ababatabssss

abababaaaba

这样就可以减少很多的匹配次数了


首页 我的博客
粤ICP备17103704号