我无法理解构造后缀树的最坏情况时间复杂度是如何线性的 - 特别是当我们需要为可能由重复单个字符组成的字符串构建后缀树时" AAAAA"
即使我要为" aaaaa"构建一个压缩后缀树,我也无法压缩任何节点,因为从节点开始的两条边都没有字符串标签从同一个角色开始。
这将导致高度为5的后缀树,并且在每次插入后缀时,我需要保持从根到叶的遍历。
以下是我的接触方式: 后缀:a,aa,aaa,aaaa,aaaaa
创建根节点,创建边缘承载' a'并将其连接到一个新节点,其左侧为" $",并重复此过程,直到我们可以aaaaa。
这将导致O(n ^ 2)而不是O(n)。 我在这里缺少什么?
答案 0 :(得分:3)
我同意这些意见,但这里有更多细节:
您描述的用于形成aaaaa
树的过程是O(n),而不是O(n ^ 2)。节点和叶子创建是常量操作,您执行它们n == 5次。你对O(n ^ 2)的假设似乎是基于你在每一步中从根到叶遍历的想法,但没有必要这样做;例如在Ukkonen的算法中:
$
标记,然后按照您创建的边缘上的字符,以及在更复杂的重复情况下的后缀链链接为什么Ukkonen算法(详细信息here)为O(n)的关键在于它维护了一个“内存”,它在哪里进行插入,形式为(a)指向前一个位置的指针插入已经完成,以及(b)后缀链接网络。该网络可能很庞大,但每个内部节点只有一个后缀链接,所以它的大小仍为O(n)。