从后缀数组制作LCP

时间:2015-06-18 06:05:51

标签: algorithm suffix-array

我正在学习后缀数组,并且成功学习了如何在O(nlognlogn)中创建一个后缀数组来自Tutorial

现在我想知道如何在O(nlogn)时间内从我的后缀阵列创建LCP阵列或者更好的是我知道O(n * n)方法。我想要更好的东西


我找不到任何好的在线资源 请帮助我,这样我就可以完全学习这个主题,这将有助于另一个。

由于

2 个答案:

答案 0 :(得分:2)

最简单的O(n)方法是从左到右(最长到最短)后缀循环。然后请注意,如果i的当前后缀与排序后缀数组表中的邻居之间的最长公共前缀(LCP)为h,则i + 1处的下一个LCP最多可减少一个。这是因为下一个后缀相当于将第一个字符前进一个,所以我们至少可以通过将邻居推进一个字符来实现h-1。如果不同的后缀恰好介于两者之间,它仍将共享至少为h - 1的前缀。

这允许我们通过向前推进而制定O(n)摊销算法,然后在前进到下一个索引时再向前推进。

正确(afaik)实施:https://sites.google.com/site/indy256/algo/suffix_array

答案 1 :(得分:1)

你可以使用kasai的算法在O(n)时间从后缀数组制作LCP数组

construction of lcp array from suffix array