1.介绍

在本教程中,我们将探讨概括的内容后缀树是如何使用它的例子找到最长的常见基础。找到最长的常见基础是一个特殊的案例字符串相似性方法通过寻找常见的子序列。这类方法中的“序列”是子串。

我们将说明通过查找最长的常见字样的概括后缀树的应用程序

然后,我们将通过首先构建一个概括的后缀树,并将一个后缀trie和patricia trie(使用字段的术语),然后注释这些树以形成概括的后缀树。

2.后缀尝试

要回答第一个问题,不,我们没有错屏蔽“树”这个词。用后缀树的语言,一个tr是构建可用于我们任务的完整概括后缀树的中间体。后缀特里是一棵树边缘,即线路连接节点,标有我们后缀的字母

我们通过按照每个后缀构建后缀树,并为每个字符创建边缘,以顶部节点开始。如果要在树中放入树中的新后缀,则从树中的一组字符开始,我们遵循这些字符,直到我们有一个不同的字符,创建一个新分支。

最好用一个例子来解释这一点。我们将使用这个词废话。这个词有8个后缀,加上一个空的后缀(由$表示):

  1. $
  2. E.
  3. SE.
  4. n
  5. eyse.
  6. 感觉
  7. nsense.
  8. onSense.
  9. 废话

我们开始使用标有$标记的起始节点和空白后缀构建后缀TRIE:

然后,后缀Trie建立,其中后缀的第一个字母连接到启动节点。我们看到前三个非空的后缀都以不同的字母开头,因此我们将三个分支添加到空白分支:

下一个后缀,eyse., 开始于E.,它已经具有来自START节点的节点。我们将此添加为分支E.通过遵循后缀的共同部分,在这种情况下E.,并添加额外的分支,其中字母不同:

我们通过在必要时添加后缀的分支来继续此过程,其中,在必要时添加新分支。我们完成后,我们得到:

在这里,我们可以看到有三个后缀开始N。我们看到,在有常见的子字段部分,它们遵循相同的分支,例如n为了nnsense.后缀。

我们还看到了如果字符串的大小T.m,即| T |= M.,后缀树完全M + 1叶节点。如果是废话,我们已经建造了一棵树9.节点。算法的复杂性取决于节点的数量。所以我们可以问下一个问题:

我们可以减少Trie中的节点数量吗?

在下一节解释的答案是建立所谓的'Patricia Trie'。

帕特里夏特里

一种Patricia Trie.是后缀树,其中只有一个孩子(没有分支)的所有“简单”节点被分组在一起。通过我们的例子,我们得到:

我们看到节点的数量减少,但叶节点的数量是相同的,即后缀的数量。构建Patricia Trie是构建后缀树(和广义后缀树)的步骤,该步骤将用于在子字符串识别中实现许多任务。

4.后缀树

与之后缀树,我们更接近创建数据结构的一步,以便于促进我们的子字符串识别任务。一个字符串的后缀树T.是一个patricia trieT.每个叶子都标有相应后缀从中开始的索引T.。此标签为我们提供了对原始后缀的直接引用:

5.概括后缀树

后缀树只有一个字符串的描述,T.但是,A.广义上述数据结构的版本可用于索引多个字符串。在这种情况下,搜索操作的结果可以是对包含给定输入字符串的字符串的引用。

概括的后缀树t_1,...,t_k是一个后缀树t_1,...,t_k,但叶节点上的标签不仅具有字符串中的位置,而且还具有所指的绳索的索引。叶子被标记为我:J., 意义 ”j字符串的后缀t_ {i}

我们将使用两个字符串的概括后缀树说明这一点,t_1 =废话t_2 =罪行

6.最长的常见基础

我们可以使用广义后缀树促进子字符串识别。主要思想是,一个字符串中的每个子字符串都是该字符串的一些后缀的前缀。换句话说,当我们在树中放置每个后缀时,我们还将后缀的每个开始字符放在树的顶部(连接到开始节点)。这些后缀的这些开始字符也是前缀的开头。两个子字段只需要仅部分地匹配树。

找到最长常见的子字符串的算法有三个步骤:

  1. 构建一个概括的后缀树T_1.T_2.
  2. 用树节点有一个来自每个节点的每个内部节点T_1.T_2.
  3. 在树上运行深度 - 首先搜索,以找到具有最高弦深的标记节点。

使用我们的示例,我们构建一个具有两个字符串的概括后缀树,废话, 和罪行。然后我们向每个节点注释每个节点是否只有字符串1,只有字符串2或两个字符串1,2

看着树(深度首先搜索),我们看到红色节点,代表eyse.是最长的常见基础。绿色节点表示较短的字符串,nSE.。由于浓缩的帕特里夏树,它们出现在同一水平。

7.结论

本文概述了如何构建概括的后缀树以解决子字符串识别问题。我们在这里概述的是一种简单的方法来生成概括的后缀树,但是有许多先进的技巧来加快算法,例如后缀树的在线建设来自赫尔辛基大学。

有几种代码来源以用几种语言构建树,例如aPython实现或者Java实现

评论在本文上关闭!