我正在阅读有关Suffix Arrays
的内容,而构建一个代码的代码很简单。但是我发现的所有资源通常都使用一个简单的示例文本,通常是banana
来解释这个概念。
因此,虽然示例文本很简单,但后缀数组已呈现(a
,ana
,anana
,banana
,na
,nana
)据我所知,这可以应用于任何类型的文本
但我不明白,如文字有空格,新行字符,标点符号等
那么这如何适用于任何类型的文本?
答案 0 :(得分:4)
对于更长的字符串,后缀数组看起来如下:
[01] banana split, yum!
[02] anana split, yum!
[03] nana split, yum!
[04] ana split, yum!
[05] na split, yum!
[06] a split, yum!
[07] split, yum!
[08] split, yum!
[09] plit, yum!
[10] lit, yum!
[11] it, yum!
[12] t, yum!
[13] , yum!
[14] yum!
[15] yum!
[16] um!
[17] m!
[18] !
然后,您可以按字母顺序对其进行排序,以找到最长的重复子字符串,这是后缀数组的常见用法。
我还记得做过类似的事情,在长文本中找到重复的单词模式,我使用空格字符作为分隔符,而不是遍历每个字符:
[01] if it is true it is true
[02] it is true it is true
[03] is true it is true
[04] true it is true
[05] it is true
[06] is true
[07] true
虽然这不是后缀数组,但按字母顺序排序后,可以找到重复的单词模式:
[01] if it is true it is true
[06] is true
[03] is true it is true
[05] it is true
[02] it is true it is true
[07] true
[04] true it is true
通过将每一行与其上方的行进行比较,只要字符匹配,我们就会发现“是真的”和“它是真的”是重复的单词模式。
这种方法的灵感来自一个常见的DNA研究问题,称为最长的重复子串问题:http://en.wikipedia.org/wiki/Longest_repeated_substring_problem
当然,它确实出现在除遗传科学之外的其他领域。