回 帖 发 新 帖 刷新版面

主题:请问有人知道后缀树的构造及查询方法吗?

为了解决最长重复子序列问题。
普通办法只想到用O(n^3)的,不知道DP方法能不能到O(n^2),查了一下,似乎用后缀树可以在O(n)时间内完成。
可是查构造方法好久,得到的中文提示让我很难构造出来,希望有人不吝告知。

回复列表 (共2个回复)

沙发

help~

板凳

构建长度为m的字符串S的后缀树,首先将后缀S[1..m]作为一条单边加入到树中。然后将后缀S[i..m]加入到成长的树中,其中i从2增长到m。这个算法的细节下所示: 

1、让Ni 表示中庸木,它把所有从1到i的 后缀进行编码。 

2、树 N1 由一条从树的根到一个标有1的叶子间的单边组成。该边用字符串S来标识。 

3、树 Ni+1 由树 Ni 来构造,过程如下: 

3.1 从 Ni 的根节点开始,运算规则发现从根开始的最长路径,并且该路径的标识要匹配后缀S[i+1..m]的前缀。这一路径通过成功地比较和匹配后缀S[i+1..m]中和沿着从根开始的一条唯一路径上的词,直到不能再匹配为止来发现的。 

    3.2 当没有更深一层的匹配时, 运算规则要么到了一个节点,称为w,要么到了一条边的中间。 

如果运算规则到了边的中间,称为(u,v),那么它通过插入一个新的节点w把(u,v)分成两条边。 

3.3 新节点w加在该边的最后一个匹配词的后面(该边的标识要匹配后缀S[i+1..m]的一个前缀)。 

3.4 在两种情况下(原来有和没有节点),运算规则都创建了一条新边 (w,i+1),该边从w延伸至一个标识为i+1的新叶子,并且用后缀S[i+1..m]中不匹配的部分来标识新边。 

我来回复

您尚未登录,请登录后再回复。点此登录或注册