【问题标题】:Generating suffixes from a Suffix Tree从后缀树生成后缀
【发布时间】:2012-04-21 21:14:03
【问题描述】:

我已经基于http://marknelson.us/1996/08/01/suffix-trees/ 的站点用Java 构建了一个后缀树,但是我遇到了一个问题。我可以很好地构建后缀树,但我可以尝试从树中构建一组所有后缀。我基本上找到了所有的“结束节点”并返回由那个“结束节点”表示的字符串

该算法适用于像“簿记员”这样的词

├── (1) bookkeeper
├── (9) e
│   ├── (8) eper
│   ├── (10) per
│   └── (12) r
├── (6) k
│   ├── (7) eeper
│   └── (5) keeper
├── (3) o
│   ├── (4) kkeeper
│   └── (2) okkeeper
├── (11) per
└── (13) r

后缀:

[bookkeeper, ookkeeper, okkeeper, kkeeper, keeper, eeper, eper, er, per, r]

但是当我使用“ATATATATATA”之类的东西时它会失败

├── (1) ATATATATATA
└── (2) TATATATATA

后缀:

[ATATATATATA, TATATATATA]

但正确的后缀应该是:

[A, ATA, ATATA, ATATATA, ATATATATA, ATATATATATA, TA, TATA, TATATA, TATATATA, TATATATATA]

我可以通过查找每个“结束节点”字符串的所有后缀来找到答案,但这似乎不是正确的方法。还有其他建议吗?

编辑: 谢谢izomorphius!在原始字符串中添加 END_CHAR 帮助了很多。

├── (21) #
├── (19) A
│   ├── (20) #
│   └── (15) TA
│       ├── (16) #
│       └── (11) TA
│           ├── (12) #
│           └── (7) TA
│               ├── (8) #
│               └── (3) TA
│                   ├── (4) #
│                   └── (1) TA#
└── (17) TA
    ├── (18) #
    └── (13) TA
        ├── (14) #
        └── (9) TA
            ├── (10) #
            └── (5) TA
                ├── (6) #
                └── (2) TA#

后缀:

[A, ATA, ATATA, ATATATA, ATATATATA, ATATATATATA, TA, TATA, TATATA, TATATATA, TATATATATA]

【问题讨论】:

  • 看起来你的树对于 ATATATATATA 不完整。

标签: algorithm data-structures suffix-tree


【解决方案1】:

关于如何构建后缀树的典型提示是添加一个您知道不在字母表中的人工字符。我通常添加“#”,然后为 ATATATATATA# 构建后缀树,这样您就不会再遇到这个问题了。

您遇到了您描述的问题,因为缺少的后缀实际上是作为另一个后缀的前缀来满足的。在末尾添加一个人造角色可确保这种情况永远不会发生。

【讨论】:

  • 啊。感谢后缀->前缀连接。现在这很有意义。
猜你喜欢
  • 2012-06-26
  • 2016-06-24
  • 2013-04-30
  • 2011-01-30
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多