我有一组潜在的无限符号:A, B, C, ...
还有一个独特的特殊占位符?
(其含义将在下面说明)。
考虑非空有限树,使每个节点都附加一个符号和0个或更多非空子树。给定节点的子树的顺序是重要的(因此,例如,如果存在具有2个子树的节点,则我们可以区分哪一个留下,哪一个是正确的)。任何给定的符号都可以出现在连接到不同节点的树0中。占位符符号?
只能附加到叶节点(即没有子树的节点)。根据树的通常定义,树是非循环的。
有限性要求意味着树中的节点总数是正有限整数。由此可见,每个子树中附加符号的总数,树深度和节点总数都是有限的。
树以功能表示法给出:节点由附加到其上的符号表示,如果有任何子树,则后面跟着包含逗号分隔的子树列表的括号,这些子树在递归中表示办法。所以,例如树
A
/ \
? B
/ \
A C
/|\
A C Q
\
?
表示为A(?,B(A(A,C,Q(?)),C))
。
我有一组预先计算的不变树 S ,将用作匹配的模式。该集合通常具有~10 5 树,并且其每个元素通常具有~10-30个节点。我可以花大量的时间事先创建最适合我下面所述问题的 S 表示。
我需要编写一个接受树 T (通常带有~10 2 节点)的函数,并在 T 包含 S 的任何元素作为子树,前提是任何带有占位符符号?
的节点都匹配任何非空子树(当它出现在 T 或在 S 的元素中。
请建议存储 S 集的数据结构和检查匹配项的算法。任何编程语言或伪代码都可以。
答案 0 :(得分:6)
This paper描述了Aho–Corasick algorithm的变体,其中不是使用有限状态机(标准Aho-Corasick算法用于字符串匹配),而是使用下推自动机进行子树匹配。与Aho-Corasick字符串匹配算法一样,它们的变体只需要一次通过输入树来匹配 S 的整个字典。
这篇论文非常复杂 - contact the author看看他是否有任何可用的源代码可能是值得的。
答案 1 :(得分:4)
您需要的是一个有限状态机,它可以跟踪您可能拥有的潜在匹配项。
本质上,这样的机器是将模式相互匹配的结果,并确定他们共享的个体匹配的哪个部分。这类似于词法分析器如何为令牌采用正则表达式集合并将它们组合成一个大型FSA,它可以通过一次处理一个字符来匹配任何正则表达式。
您可以在term rewriting systems下找到对此方法的引用。