我担心Ukkonen算法的渐近运行时间问题,它可能是在线性(?)时间构造后缀树的最流行算法。
这是丹·古斯菲尔德(Dan Gusfield)撰写的《关于字符串,树和序列的算法》(第6.5.1节)的引用:
“ ... Aho-Corasick,Weiner,Ukkonen和McCreight算法都需要空间,或者O (m )时限应替换为O (m log m )和O的最小值(m log | Σ |) ”。
[ 是字符串长度,Σ是字母的大小]
我不明白为什么这是真的。
- 空间:好吧,如果我们使用大小为数组表示节点外的分支,那么实际上,我们最终会占用Θ (m | Σ |)空间。但是,据我所知,还可以使用哈希表(例如Python中的字典)存储分支。这样一来,我们将只将Θ (m )指针存储在所有哈希表中(因为树中有Θ (m )个边),同时仍然能够访问O (1 )中的子节点。 时间,与使用数组时一样快。
- 时间:如上所述,使用哈希表使我们能够在时间内访问任何节点的传出分支。由于Ukkonen的算法需要O (m )个操作(包括访问子节点),因此总运行时间也将为O (m )。
对于任何提示我为什么我的结论是错误的以及Gusfield为什么Ukkonen算法对字母的依赖性是正确的,我将不胜感激。
3
我认为没有任何证据可以证明不可能实现与字母大小无关的时间/空间限制。我相信古斯菲尔德之所以发表这一声明,是因为没有已知的方法可以完全摆脱时限。为了建立一个,您必须更详细地说明您的哈希函数。哈希查找的真正最坏情况O(1)时间限制要求完美的哈希。我尚不清楚在算法期间如何执行此操作(因为此时哈希条目不是静态的)。
—
jogojapan
(续)一旦树完成,就可以执行此操作,但是算法本身的时间范围将保持不变。(不过是问题的+1。)
—
jogojapan 2013年
有用的内容:Ukkonen的算法得到了解释
—
FrankW 2014年