您如何将后缀数组实际应用于任何类型的文本



我正在阅读有关Suffix Arrays的信息,构建一个的代码很简单。但是我找到的所有资源通常都使用一个琐碎的示例文本,通常是banana,来解释这个概念。
因此,尽管示例文本是微不足道的并且后缀数组被呈现(aanaananabananananana),但据我所知,这可以应用于任何类型的文本。
但我不明白为什么,因为文本有空格、换行符、标点符号等。
那么这如何适用于任何类型的文本呢?

对于较长的字符串,后缀数组如下所示:

[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

当然,它确实出现在遗传科学以外的其他领域。

相关内容

最新更新