digraph ukk{
rankdir=LR;
R -> A [label="bcabx"];
R -> B [label="cabx"];
R -> C [label="ab" color=blue];
C -> D [label="cabx" color=blue];
C -> E [label="x" color=blue];
}
处理完成之后新的活动点变成了#=6, (R, b, 1), 2。由此我们可以归约出规则1
当向根节点插入时遵循:
active_node为root
active_edge为即将被插入的新后缀首字符
active_length减1
然后现在由于b后面接的是c,而我们现在要插入的后缀是bx,因此仍然需要分裂
digraph ukk{
rankdir=LR;
R -> A [label="b" color=blue];
A -> F [label="cabx" color=blue];
A -> G [label="x" color=blue];
R -> B [label="cabx"];
R -> C [label="ab"];
C -> D [label="cabx"];
C -> E [label="x"];
}
digraph ukk{
rankdir=LR;
R -> B [label="cabx"];
R -> A [label="b" color=blue];
A -> F [label="cabx" color=blue];
A -> G [label="x" color=blue];
R -> C [label="ab"];
C -> D [label="cabx"];
C -> E [label="x"];
C -> A [style="dotted"];
}
然后处理新的活动点,由于原来的边中没有x开头的字符串,因此直接加入即可
digraph ukk{
rankdir=LR;
R -> B [label="cabx"];
R -> A [label="b" color=blue];
A -> F [label="cabx" color=blue];
A -> G [label="x" color=blue];
R -> C [label="ab"];
C -> D [label="cabx"];
C -> E [label="x"];
C -> A [style="dotted"];
R -> H [label="x"]
}
因此我们可以总结出活动点为根节点时的规则
> 如果active_edge为空则查找根节点下的所有边,如果首字符和当前字符相同,则active_edge为当前字符,active_length为1,否则直接插入。
> 如果active_edge不为空,则判断active_edge下active_length位置的字符是否相同,如果相同active_length++,如果不同则使用上面两条规则进行分裂
继续第7步(字符为a)`#=7, (R, a, 1), 1`和第8步(字符为b)`#=8, (R, a, 2), 2`
处理第9步,字符为c。注意此时active_node变成了节点C。`#=9, (C, c, 1), 3`
处理第十步,字符为d。此时由于没有匹配需要进行分裂,并且此时剩余后缀数为4也就是说需要处理abcd,bcd,cd,d四个后缀。
digraph ukk{
rankdir=LR;
C [color=red];
R -> B [label="cabxabcd"];
R -> A [label="b" ];
A -> F [label="cabxabcd"];
A -> G [label="xabcd"];
R -> C [label="ab"];
C -> D [label="c" color=blue];
D -> I [label="d" color=blue];
D -> J [label="abxabcd" color=blue];
C -> E [label="xabcd"];
C -> A [style="dotted"];
R -> H [label="xabcd"]
}
digraph ukk{
rankdir=LR;
A [color=red];
R -> B [label="cabxabcd"];
R -> A [label="b" ];
A -> F [label="c" color=blue];
F -> K [label="d" color=blue];
F -> L [label="abxabcd" color=blue];
A -> G [label="xabcd"];
R -> C [label="ab"];
C -> D [label="c"];
D -> I [label="d"];
D -> J [label="abxabcd"];
C -> E [label="xabcd"];
C -> A [style="dotted"];
R -> H [label="xabcd"];
D -> F [style="dotted"];
}
digraph ukk{
rankdir=LR;
R [color=red];
R -> B [label="c" color=blue];
B -> M [label="d" color=blue];
B -> N [label="abxabcd" color=blue];
R -> A [label="b" ];
A -> F [label="c"];
F -> K [label="d"];
F -> L [label="abxabcd"];
A -> G [label="xabcd"];
R -> C [label="ab"];
C -> D [label="c"];
D -> I [label="d"];
D -> J [label="abxabcd"];
C -> E [label="xabcd"];
C -> A [style="dotted"];
R -> H [label="xabcd"];
D -> F [style="dotted"];
F -> B [style="dotted"];
}
然后根据规则1活动点变为(R, d, 0),也就是说只要插入一条新的边
digraph ukk{
rankdir=LR;
R [color=red];
R -> B [label="c"];
B -> M [label="d"];
B -> N [label="abxabcd"];
R -> A [label="b" ];
A -> F [label="c"];
F -> K [label="d"];
F -> L [label="abxabcd"];
A -> G [label="xabcd"];
R -> C [label="ab"];
C -> D [label="c"];
D -> I [label="d"];
D -> J [label="abxabcd"];
C -> E [label="xabcd"];
C -> A [style="dotted"];
R -> H [label="xabcd"];
D -> F [style="dotted"];
F -> B [style="dotted"];
R -> O [label="d"];
}