【问题标题】:How to match a tree against a large set of patterns?如何将树与大量模式匹配?
【发布时间】:2013-06-12 08:38:31
【问题描述】:

我有一组可能无限的符号:A, B, C, ... 还有一个独特的特殊占位符符号?(其含义将在下面解释)。

考虑非空有限树,使得每个节点都附有一个符号和 0 个或多个非空子树。给定节点的子树的顺序很重要(因此,例如,如果有一个节点有 2 个子树,我们可以区分哪一个是左边的,哪一个是右边的)。任何给定的符号都可以在树中出现 0 次以上,附加到不同的节点。占位符符号? 只能附加到叶节点(即没有子树的节点)。根据树的通常定义,树是无环的。

有限性要求意味着树中的节点总数是一个正有限整数。由此可见,附加符号的总数、树的深度和每个子树中的节点总数都是有限的。

树以函数式表示法给出:一个节点由一个附加到它的符号表示,如果有任何子树,则后面是括号,其中包含以逗号分隔的子树列表,以递归方式表示大大地。所以,例如树

                    A
                   / \
                  ?   B
                     / \
                    A   C
                   /|\
                  A C Q
                       \
                        ?

表示为A(?,B(A(A,C,Q(?)),C))

我有一组预先计算的不变的树 S 将用作匹配的模式。该集合通常有大约 105 棵树,每个元素通常有大约 10-30 个节点。我可以使用大量时间预先创建最适合我下面所述问题的任何 S 表示。

我需要编写一个函数来接受一个树 T(通常有大约 102 个节点)并尽可能快地检查 T 包含 S 的任何元素作为子树,前提是具有占位符符号 ? 的任何节点匹配任何非空子树(无论是出现在 T 中还是出现在S 的元素)。

请建议一种数据结构来存储集合 S 和检查匹配的算法。任何编程语言或伪代码都可以。

【问题讨论】:

  • 尝试研究“正则树语法”和树自动机。
  • @tmyklebu A(?) 被认为是一种模式,表示带有符号A 的节点只有一个子树。所以,它不匹配A(B,C)A,但它会匹配A(B)A(B(C,D))
  • @jwpat7 在有一个节点有两个子树的情况下,我提到了左右子树。如果一个节点只有一个子树,那么 子树在可视图上的位置并不重要。没有空的子树——所以,没有像A(,B) 这样的东西。符号Q(?) 表示具有单个子树的节点Q,该子树由具有占位符符号? 的单个节点组成。如果将其视为一种模式,它会匹配具有根节点Q 的任何树以及任何形式的一个非空子树,例如Q(A)Q(A(B,C(D)))...
  • @jwpat7 ...但是Q(?) 不匹配Q(0 个子树)、Q(A,B)(2 个子树)或A(Q)(根处的错误符号) .不过它匹配?,因为占位符? 代表任何树,包括那些可以被Q(?) 匹配的无占位符的树。因此,仅考虑匹配的可能性,我们认为匹配成功。还可以看出,因为? 是比Q(?) 更通用(更具包容性)的模式,匹配在另一个方向上有效地执行(即? 匹配任何树,包括Q(?))。抱歉,我没有在我的问题中解释最后一点。
  • @jwpat7 ...我认为,更清楚的解释是,如果“模式”树(S 的元素)和“数据”树 T 包含占位符 ?,匹配成功 iff当图案重叠时)。

标签: algorithm optimization data-structures tree pattern-matching


【解决方案1】:

This paper 描述了Aho–Corasick algorithm 的一个变体,该算法不使用有限状态机(标准 Aho–Corasick 算法用于字符串匹配),而是使用下推自动机进行子树匹配。与 Aho-Corasick 字符串匹配算法一样,它们的变体只需要通过输入树一次即可匹配整个 S 字典。

这篇论文相当复杂 - 可能值得contact the author 看看他是否有任何可用的源代码。

【讨论】:

  • +1。在检查这篇论文时,它似乎比我的建议更符合 OP 的要求。
【解决方案2】:

您需要的是一个有限状态机,它可以跟踪您可能拥有的一组潜在匹配项。

本质上,这样的机器是模式相互匹配的结果,并确定它们共享的个体匹配部分。这类似于词法分析器如何将一组正则表达式用于标记并将它们组合成一个大型 FSA,该 FSA 可以通过一次处理一个字符来匹配任何正则表达式。

您可以在term rewriting systems 下找到有关执行此操作的方法的参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多