我搜索了论坛,但如果其他类似的问题必然与此相关,我无法弄明白。
我要做的是将子树与对象树匹配。
我知道有基于后缀树或自动机的模式匹配算法,但我不确定它们是否适用于此。
我试图将图片中红色节点给出的子树与更大的树匹配,无论树的整体结构如何,或者红色节点是否有子节点。
直接模式匹配不起作用的原因是节点的排序(后/预订,广度)将不可用。
所以我正在考虑编写一个从子树的根开始的递归算法,并尝试匹配节点然后匹配它们的子节点。
我想知道是否存在任何此类(有效算法)。如果已经被问过,请道歉。
答案 0 :(得分:3)
以下是一些可能对您有帮助的参考资料:
Aho的Efficient Tree Pattern Matching: an Aid to Code Generation
斯坦福大学的Tree pattern matching programs
来自IMECS 2011:Tree Pattern Matching Algorithm Using a Succinct Data Structure
答案 1 :(得分: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;
}
希望这也有助于其他人。