【问题标题】:How to construct a suffix Trie for all the substrings of a string?如何为一个字符串的所有子串构造一个后缀Trie?
【发布时间】:2015-06-09 01:00:27
【问题描述】:
我想为字符串的所有子字符串构建一个节省空间的后缀树;
假设字符串的长度为 5000,则子字符串的数量约为 25*10^6,并且对于每个节点我存储一个大小为 26 的链接数组
所以总内存 = 26*5000*5000 这是不可能的,所以预计会出现运行时错误。
我有一个节省空间的后缀特里树的解决方案,我们在其中压缩我们没有选择的路径,因此空间的顺序大致变为线性。
但我无法理解,所以任何人都可以帮助我解决这个问题。
【问题讨论】:
标签:
substring
suffix-tree
suffix-array
【解决方案1】:
我认为您不搜索树,而是搜索后缀树。
压缩路径是一种方法,但我只会搜索 Ukkonen 算法。时间和空间复杂度为 n。
如果您想要更好理解的内容,只需搜索 Suffix Arrays。空间复杂度也是 n,具有较低的常数(大约 6 而不是 32 左右,我不记得确切的数字)并且通过硬件更好地预测缓存。
【解决方案2】:
不确定你的算术...但如果你只有一个字符串,你的树必须是 26n 大小。
从技术上讲,您可以将 Suffix Trie/Tree 替换为 Suffix Array + LCP Array,从而保持与基本图形操作相同的速度。
内存消耗为 1 + 4 + 4 = 9n。
缺点是原字符串不容易改。