读书人

清华严版数据结构(串的模式匹配KMP算

发布时间: 2012-02-27 10:00:22 作者: rapoo

清华严版数据结构(串的模式匹配KMP算法)有点疑问,请大虾们给予帮助。
严版的算法是这样的:
void get_next(SString T,int &next[])
{
//求模式串T的next函数值并存入数组next
i = 1;
next[1] = 0;
j = 0;
while(i < T[0])
{
if(j == 0 || T[i] == T[j])
{
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
}

上面的算法我应该能理解,T[0]存储字符串长度,通过next[i]求next[i + 1],关键是后面提到的关于KMP算法的改进,原算法如下:
void get_nextval(SString T,int &nextval[])
{
//求模式串T的next函数值并存入数组nextval
i = 1;
nextval[1] = 0;
j = 0;
while(i < T[0])
{
if(j == 0 || T[i] == T[j])
{
++i;
++j;
if(T[i] != T[j])
nextval[i] = j;
else
nextval[i] = nextval[j]; //后面有疑问
}
else
j = next[j];
}
}

我的疑问在于当(T[i] != T[j])为假,那么执行nextval[i] = nextval[j]; 这条语句。问题是执行了以后j应该取什么值呢?我理解的是,当再次进入while循环体内,if(j == 0 || T[i] == T[j])这个判断条件中j 为nextval[i],在没有改进的时候,因为执行了++i和++j,所以当再次进入while循环体后,j刚好是next[i]。可是如果改进了后,并且执行了nextval[i] = nextval[j];后,j 就不一定是nextval[i]。于是我修改了一下算法,在nextval[i] = nextval[j]; 后面加了一条语句 j = 在nextval[i] = j;。遗憾的是此时求出的nextval的值是错的,到底哪里理解错了呢?

------解决方案--------------------


这个关于kmp的,版上不知讨论了多少帖
[解决办法]
明白了就好,呵呵,贴出来给大家看看。
其实书上用 aaabaaaab里面寻找 aaaab 这个例子很能说明问题。

读书人网 >软件架构设计

热点推荐