【问题标题】:finding common sub trees in a tree在树中查找公共子树
【发布时间】:2012-03-04 07:26:51
【问题描述】:

考虑下面这个概念图,它仅用于演示目的。

   Abc       Foo
     \       /   \
      \     /     Foo2
        Bar        \
      /    \       Foo3
     Bar2   Bar3     \
     /   \           Foo4
     X    Y

在上面的树中,有一个唯一的“路径”,Foo->Bar->Bar2->X。这条路径不同于 Abc->Bar->Bar2->X .. 显然这些信息在上述表示中丢失了,但考虑到我存储了所有单独的唯一路径。

但是,它们确实共享路径“Bar->Bar2->X”的某些部分。

我试图找到或实施的算法的目的是我想汇总这些信息,这样我就不能存储单独的路径。但更重要的是,我试图找到所有这些共同的路径,并赋予它们权重。因此,例如,在上述情况下,我可以压缩有关“Bar->Bar2->X”的信息并说它发生了 2 次。显然,我要求它适用于所有情况。

是的,最终的想法是能够快速提出“向我展示来自 Foo 的所有不同路径”的问题。在这个例子中只有 1 个,Foo->Bar->Bar2->X。 Foo->Bar->Bar2->Y 和 Foo->Bar->Bar3 不存在。该图仅供查看。

有什么想法吗?

【问题讨论】:

标签: algorithm graph tree graph-algorithm


【解决方案1】:

所以这只是一个起点,我希望其他人能帮助我填写,但我会将它们视为字符串,并将常见的子路径视为过去已经研究过的常见子字符串问题。在我的脑海中,我可能会反转每个路径/字符串,然后从中构建一个 trie 结构,因为然后通过计算给定节点下方的键数,您可以看到该结束路径被使用了多少次......可能有一种更好,更有效的方法,但这应该有效。其他人有关于将它们视为字符串的想法吗?

【讨论】:

    【解决方案2】:

    您可以单独存储每个唯一路径。要回答“谁给Foo 打电话”之类的问题,您可以创建一个哈希表形式的索引。

    作为替代方案,您可以尝试使用DAWG,但我不确定它对您的情况有多大帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2011-10-04
      • 2012-06-15
      • 1970-01-01
      相关资源
      最近更新 更多