目录
(3):关于KMP函数里,next数组赋初值 和 调用Get_next函数的语句的问题:
(5):为什么地址(指针)传值的时候及调用函数的时候不能写next[]
实现代码的过程中
具体细节、问题:
(1):关于写Get_next函数的标题:
现象:
PPT上写的是:
void get_next(SString T, int &next[])
然而并不能运行,而当我们去掉了引用符号(&)以后:
void get_next(SString T, int next[])
却可以运行,但是这里引用的符号就代表着把数据传回(给)主函数,所以最好不要省略
//&:返回所有我们算出的next[]
原因:
数组不能采用引用格式来传值
根本不存在“元素都是引用的数组”:
本身数组就是用他的首地址来传值的,其首地址代表一大串数组的信息和地址(位置)
而引用传值只是给变量取了一个别名来传值,自然不能无法整个数组的值
总得来说就是一个格式的问题
(2):关于Get_next函数中k的初值:
int j = 0,//从头开始算起
k = -1;
next[0] = -1;//根据公式
一开始我们想令 k = 0; ,后面真的想去运行以后发现不可以:
根据公式和算法设计,即使是MAX[k]也必须要小于j
(3):关于KMP函数里,next数组赋初值 和 调用Get_next函数的语句的问题:
不同版本不同教材的不同写法:
网课(PPT):
int i = pos, j = 1;
没有给next数组赋初值
也没有调用Get_next函数
啥也没有,主打的就是一个陪伴
乐
这样是肯定不行的:

书上:
int next[MAXLEN];
int i = pos, j = 1;
Get_next(T, next);
给next数组赋初值
调用Get_next函数,但是里面写的是next而非next[]
结果:


把书上的改进为:
给next数组赋初值
调用Get_next函数,并且写next[]
int next[MAXLEN];
int i = pos, j = 1;
Get_next(T, next[]);
结果也不行:

到这里,我们似乎已经山穷水尽,走投无路了
这个时候多和同学沟通交流就成了关键,于是我们又有了如下进展,这也是我们最终最重要的
问题(3)的收获:
(1):首先:

文章详细讨论了在实现KMP算法时,Get_next函数的编写和使用过程中遇到的问题,包括函数标题的引用符号、k的初始值、next数组的初始化和调用,以及传值方式的选择。作者指出数组不能用引用传值,并提供了两种正确的函数定义方式。同时,文章比较了不同教材中对nextval[j]的处理,强调了清晰的代码结构的重要性。
最低0.47元/天 解锁文章
1857





