主题:请问有人知道后缀树的构造及查询方法吗?
argentmoon
[专家分:13260] 发布于 2006-04-10 23:39:00
为了解决最长重复子序列问题。
普通办法只想到用O(n^3)的,不知道DP方法能不能到O(n^2),查了一下,似乎用后缀树可以在O(n)时间内完成。
可是查构造方法好久,得到的中文提示让我很难构造出来,希望有人不吝告知。
回复列表 (共2个回复)
沙发
argentmoon [专家分:13260] 发布于 2006-04-11 17:35:00
help~
板凳
bricks [专家分:20] 发布于 2006-06-12 11:06:00
构建长度为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]中不匹配的部分来标识新边。
我来回复