求NEXT数组的函数 来源(http://cn.math.pku.edu.cn/teachers/zhangnx/ds/Á¢Ìå¿Î¼þ/PS/ģʽƥÅä/¼ÆËãnextÊý×éµÄÔ´³ÌÐò.htm)
void makeNext(PSeqString p, int *next)
/* 变量next是数组next的第一个元素next[0]的地址 */
{
int i=0,k=-1; /* 初始化 */
next[0]=-1;
while (i<p->n-1) /* 计算next[i+1] */
{
while (k>=0 && p->c[i]!=p->c[k])
{
k=next[k]; /* 找出p0…pi中最大的相同的前后缀长度k */
}
i++; k++;
if (p->c[i]==p->c[k]) /* 填写next[i],同时考虑改善 */
next[i]=next[k];
else next[i]=k;
}
}
计算next数组最简单的方法就是穷举法,算法的复杂度为O(m*m),整个算法的复杂度为O(m*m+n)。
不过还有复杂度为O(m)的算法,思想如下:假设P1P2...Pk = Pi-k+1...Pi,那么next[i] = k + 1 。当我们计算next[i+1]时,如果发现Pk+1 = Pi+1, 也就是P1P2...PkPk+1 = Pi-k+1...PiPi+1,那么next[i+1] = next[i] + 1 = k + 2。 但是如果Pk+1 <> Pi+1, 则比较next[k]和Pi+1(找下一个满足P1P2...Pk' = Pi-k'+1...Pi的k'),一直到匹配成功为止。
真是对不起,我还没看完数据结构,我也是现炒现卖的,真的对不起了
[此贴子已经被作者于2004-10-08 16:26:07编辑过]