书籍中疑似错误反馈

书籍第55页关于双数组的定义,书籍中做如下定义:
p = base[b] + c
check[p] = base[b]
但是我查阅资料后,发现第二个公式有问题,依据双数组的定义,check数组中保存的应该是父状态,而不是状态的base值,即
check[p] = b

提问前请先搜索

没明白为啥可以这么变种,按我的理解,check之所以取base的index作为上一个状态,是因为只有index才是唯一的,才能唯一确定来自于哪个状态?而base[i]不一定唯一吧?
https://zhuanlan.zhihu.com/p/35193582 这篇文章最后提到的:


应该就是变种的写法吧?如果失去了回溯的能力,会不会有问题?

是对该变种的Java移植, base[i] 一定唯一,因为构建算法保证每个 base[i] 只使用一次,你可以从代码中找到这个保证。知乎帖子作者所说回溯的意思可能指的是从子节点回溯父节点,该能力并没有丧失。变种的转移公式为:

base[r] + c = s \\ check[s] = base[r]

给定子节点状态 s ,代入 check 数组得到 check[s] 即为父节点 base ,减去父节点 base 即为转移条件 c ,一切都是可回溯的。这应该回答了你的问题。

你可以仔细读一读《自然语言处理入门》p58的3个步骤,其中,步骤3所谓的 h 就是递归一次之后步骤2的 b ,即子节点(的孙节点所共享)的 base

base[i]保证唯一就明白了,我抽空看看代码,感谢!