在这一点上,我觉得有点笨拙。我花了好几天时间试图完全理解后缀树的构造,但是因为我没有数学背景,许多解释都让我难以理解,因为他们开始过度使用数学符号学。我发现最接近好的解释是使用后缀树快速字符串搜索,但他掩盖了各点,算法的某些方面仍然不清楚。
在Stack Overflow上对这个算法的逐步解释对除了我之外的许多人来说都是无价的,我敢肯定。
作为参考,这里是Ukkonen关于算法的论文:http://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf
到目前为止,我的基本理解是:
正如大多数解释中指出的那样,基本算法似乎是O(n2),因为我们需要遍历所有前缀,然后我们需要遍历每个前缀的每个后缀。Ukkonen的算法显然是独一无二的,因为他使用了后缀指针技术,尽管我认为到是我难以理解的。
我也很难理解:
这是完整的c#源代码。它不仅工作正常,而且支持自动规范化,并为输出呈现更美观的文本图。源代码和示例输出位于:
更新时间2017-11-04
多年后,我发现了后缀树的新用途,并在javascript中实现了算法。Gist如下。它应该是bug的。将其转储到一个js文件中,从同一位置npm install chalk
,然后使用node.js运行以查看一些丰富多彩的输出。在同一Gist中有一个精简的版本,没有任何调试代码。
https://gist.github.com/axefrog/c347bf0f5e0723cbd09b1aaed6ec6fc6