【问题标题】:Partial subtree-matching algorithm部分子树匹配算法
【发布时间】:2012-07-07 18:23:55
【问题描述】:

我搜索了论坛,但我无法弄清楚其他类似问题是否必然与此相关。

我要做的是将子树与对象树匹配。

我知道有基于后缀树或自动机的模式匹配算法,但我不确定它们是否适用于此。

我试图将图片中红色节点给出的子树与更大的树进行匹配,无论树的整体结构或红色节点是否有子节点。

简单的模式匹配不起作用的原因是没有可用的节点排序(后/预排序、广度)。

所以我正在考虑编写一个递归算法,它从子树的根开始并尝试匹配节点,然后是它们的子节点。

我想知道是否存在这样的(高效算法)。抱歉,如果这已经被问到了。

【问题讨论】:

  • 目前还不清楚你到底想做什么。也许您可以添加示例输入和预期输出?
  • 树中的节点是对象,比如说A、B、C...它们可以根据它们的属性进行比较,所以我们有排序和相等性。预期的输入是一个像上面红色的片段和一棵完整的树。预期输出是在树中找到片段的位置。

标签: algorithm matching subtree


【解决方案1】:

以下是一些可能对您有所帮助的参考资料:

阿霍的Efficient Tree Pattern Matching: an Aid to Code Generation

斯坦福的Tree pattern matching programs

来自 IMECS 2011:Tree Pattern Matching Algorithm Using a Succinct Data Structure

【讨论】:

    【解决方案2】:

    看来我正在寻找一种解决“树包含问题”的算法。我找到了一些有用的文件:

    Fast Algorithms for Finding Nearest Common Ancestors

    The Tree Inclusion Problem: In Optimal Space and Faster

    Tree Isomorphism And Related Problems

    我将上一篇论文中的一个算法翻译成 C#(返回 a 和 b 的第一级子树之间最大匹配中的对数)。

    public static int Match(Node a, Node b, NodeSimilarityComparer comp) {
      if (!comp.Equals(a, b))
        return 0;
      int m = a.SubtreeCount;
      int n = b.SubtreeCount;
      var matrix = new int[m + 1, n + 1];
    
      for (int i = 0; i <= m; ++i)
        matrix[i, 0] = 0;
    
      for (int j = 0; j <= n; ++j)
        matrix[0, j] = 0;
    
      for (int i = 1; i <= m; ++i)
        for (int j = 1; j <= n; ++j) {
          var ai = a.GetSubtree(i - 1);
          var bj = b.GetSubtree(j - 1);
          var match = Match(ai, bj, comp);
          matrix[i, j] = Math.Max(Math.Max(matrix[i, j - 1], matrix[i - 1, j]), matrix[i - 1, j - 1] + match);
        }
      return matrix[m, n] + 1;
    }
    

    希望这对其他人也有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2011-09-02
      • 2013-05-18
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多