我正在查看引入后缀数组"SUFFIX ARRAYS: A NEW METHOD FOR ON-LINE STRING SEARCHES"的原始论文图3中给出的伪代码。
我无法弄清第4行和第5行的逻辑(从0开始索引)。这些专栏写着:
否则,如果 r&lt; P 或 w r ≤a Pos [N-1] + r 然后< / EM>
L W ←N
W
是长度的模式&#39; P&#39;我们正在寻找,r
是lcp(A[pos[N-1]:], W)
。问题是,在几乎所有情况下,lcp
的长度都会小于W的长度。这个条件是为了处理这种情况(我认为)这个模式在字典上大于数组中按字典顺序排列的最大后缀,但它根本没有对此进行测试。第2行和第2行3,另一方面,哪个测试W
是否小于词典上最小的后缀似乎是完全正确的
如果 l = P 或 w l ≤a Pos [0] + l 然后
L W ←0
我相信原始的行应该是这样的:
否则,如果 r&lt; P 和 w r &gt; a Pos [N-1] + r 然后
L W ←N
W
可能大于A[pos[N-1]:]
的唯一方法是,如果它的lcp
短于模式的长度(否则,所有W
匹配并且所以W
不能更大,只能小于或等于我们与lcp
共享的内容}如果lcp
中的字符在W
中更大而不是A[pos[N-1]]
。这看起来有意义吗?这是原始论文中的错误吗?如果没有,有人可以向我解释我是如何误解原始代码的吗?
答案 0 :(得分:3)
我认为你理解论文是正确的,事实上它有错误。
请考虑以下示例:let A = banana
,W = nana
。然后是A[pos[N-1]:] = nana
。算法集LW = N
甚至失败,而事实上它是N-1
。