算法 – 构建后缀树的复杂性

要构建一个后缀树,在最坏的情况下,如果字符串的所有字母都不同,复杂性将是类似的

n + (n-1) + (n-2) ... 1 = n*(n+1)/2

其为O(n ^ 2)。

然而根据http://en.wikipedia.org/wiki/Suffix_tree建立后缀树需要O(n)时间。我在这里失踪了什么?

你的直觉背后为什么算法应该是Θ(n2)是一个好的,但大多数后缀树的设计,消除了对这个时间复杂度的需要。直观地,看起来你需要Θ(n2)不同的节点来保存所有不同的后缀,因为你需要n(n-1)… 1个不同的节点。然而,后缀树通常被设计为使得在后缀中每个字符不存在单个节点。相反,每个边缘通常标记有作为原始字符串的子串的字符序列。它仍然可能看起来你需要Θ(n2)时间来构造这棵树,因为你必须将子字符串复制到这些边缘,但通常这是通过一个可爱的窍门 – 避免了 – 因为所有的边缘都标记为字符串作为输入的子串,可以替代地用开始和结束位置来标记边缘,这意味着可以在O(1)时间中并且使用O(1)空间构建跨越Θ(n)个字符的边。

也就是说,构建后缀树仍然是很难做到的。维基百科中引用的Θ(n)算法不容易。发现在线性时间中工作的第一个算法之一是Ukkonen’s Algorithm,这在字符串算法的教科书中是常见的(如Algorithms on Strings, Trees, and Sequences).原始论文在维基百科中链接。

希望这可以帮助!

http://stackoverflow.com/questions/7451942/complexity-of-building-a-suffix-tree

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:算法 – 构建后缀树的复杂性