【发布时间】: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