【问题标题】:an algorithm - suffix tree一种算法——后缀树
【发布时间】:2014-06-10 07:16:38
【问题描述】:

给定一个包含 2 个字符串的通用后缀树:st1 和 st2。

如果子树中有一个离开V的叶子代表st1(和/或st2)的后缀,则需要找到一种算法,将每个节点V标记为1(和/或2)。

我的猜测是,我们需要使用这样一个事实,即 st1 的每个后缀的最后一个字母是 $,而每个后缀 st2 的最后一个字母可能是 #。但在我看来,从下到上扫描树的效率很低。

任何想法如何处理它?

例如:我有两个字符串:st1=abab,st2=aab。在图片中,我制作了带有标记的广义后缀树。所以从带有字母a的节点我有一个来自他的子树的叶子代表st1的后缀,所以我将它标记为1,我有一个来自他的子树的叶子代表st2的后缀,所以我也将它标记为2。

【问题讨论】:

  • 你能举个例子吗?
  • 这是stackoverflow.com/questions/9452701/…你想要的吗?
  • 没有。仅仅因为它是关于后缀树的,并不意味着它是同一个问题。
  • 如果要标记每个节点,则必须访问每个节点一次。所以自下而上的全扫描并不是一个糟糕的方法。 (如果给定节点的任何子节点标记为 1,则给定节点标记为 1)。
  • 但是你如何从下到上扫描一棵树? casuse bfs 和 dfs 从上到下...

标签: algorithm suffix-tree


【解决方案1】:

当您执行 DFS 时,您可以使用标记为“1”和/或“2”标记父节点(在访问子节点之后),这取决于您是否有 st1/st2 的结束标记或子节点已标记为 st1 的后缀/st2。

这利用了这样一个事实,即如果任何子代包含 st1 的后缀,那么父代也必须包含 st1 的后缀。

【讨论】:

  • 是的,我同意你的想法.. 但是你如何识别你是否已经访问了一个节点的孩子?
  • 它是树,所以如果你做正确的 DFS,那么你总是会访问树中的所有节点,你甚至不必标记你访问的节点(因为每个节点只有 1 种方式) .您唯一需要考虑的是访问后序排序中的节点,因此您可以使用标志标记子节点,然后您可以检查来自“已访问”父节点的标志或 EndOfString 标记。
  • 那么复杂性是多少? O(V) ?如果 V 是节点。
猜你喜欢
  • 2015-04-01
  • 2010-11-21
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多