首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

清华严版数据结构(串的模式匹配KMP算法)有点疑问,请们给予帮助

2012-02-27 
清华严版数据结构(串的模式匹配KMP算法)有点疑问,请大虾们给予帮助。严版的算法是这样的:voidget_next(SStr

清华严版数据结构(串的模式匹配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 这个例子很能说明问题。

热点排行