在树中寻找共同的子树

时间:2012-03-04 07:26:52

标签: algorithm graph tree graph-algorithm

请考虑下面的概念图​​,仅供演示之用。

   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不存在。该图仅供查看。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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