7
普通英语的Ukkonen后缀树算法
在这一点上我感觉有点浓。我花了几天的时间试图完全围绕后缀树构造,但是由于我没有数学背景,因此许多解释都使我难以理解,因为它们开始过度使用数学符号系统。我发现的最接近很好的解释是带有后缀树的快速字符串搜索,但是他掩盖了各个要点,并且算法的某些方面仍不清楚。 我敢肯定,在堆栈溢出上对此算法的分步说明对我以外的其他许多人来说都是无价的。 作为参考,这里是有关算法的Ukkonen论文:http : //www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf 到目前为止,我的基本了解: 我需要遍历给定字符串T的每个前缀P 我需要遍历前缀P中的每个后缀S并将其添加到树中 要将后缀S添加到树中,我需要遍历S中的每个字符,其中的迭代包括沿着以S中相同的字符集C开头的现有分支以及当我将边缘拆分成后代节点时进行在后缀中找到一个不同的字符,或者如果没有匹配的边要走。当找不到匹配的边沿C向下走时,将为C创建新的叶边。 正如大多数解释中所指出的那样,基本算法似乎是O(n 2),因为我们需要逐步处理所有前缀,然后才需要逐步处理每个前缀的每个后缀。Ukkonen的算法显然是独特的,因为他使用了后缀指针技术,尽管我认为这是我难以理解的。 我也很难理解: 准确地分配,使用和更改“活动点”的时间和方式 该算法的规范化方面发生了什么 为什么我看到的实现需要“修复”他们使用的边界变量 这是完整的C#源代码。它不仅可以正常工作,而且支持自动规范化,并呈现输出的外观更好的文本图。源代码和示例输出位于: https://gist.github.com/2373868 更新2017-11-04 多年后,我发现后缀树有了新的用途,并在JavaScript中实现了该算法。要点在下面。它应该没有错误。npm install chalk从相同位置将其转储到js文件中,然后与node.js一起运行以查看一些彩色输出。在同一个Gist中有一个精简版,没有任何调试代码。 https://gist.github.com/axefrog/c347bf0f5e0723cbd09b1aaed6ec6fc6