无序树模式匹配算法

时间:2017-08-28 17:21:00

标签: algorithm tree pattern-matching

我试图找到一个合理的算法,找到无序的有根树中的第一个树模式匹配。根据{{​​3}}我遇到过,这个问题是NP-Complete。我不需要找到每个模式匹配,我只需要找到存在的任何模式匹配。优选地,我宁愿不必执行"删除"在我的树上(我也不想复制删除节点)。

另外需要注意的是树将在树匹配查询之间更新,因此我也希望可能有一些算法利用这一事实,可能使用跟踪以前的跟踪方法树中的部分匹配以优化未来的匹配。

根据我提到的标准,是否有一个简单的算法可以解决这个问题,但是仍然比纯粹的天真蛮力方法更好?

注意,我的问题类似于some research,但该问题特定于有序树。

1 个答案:

答案 0 :(得分:0)

根据http://www.sciencedirect.com/science/article/pii/S1570866704000644,NP-complete的问题是树包含。这意味着树可以适合潜在的跳过几代人。因此,例如,一棵树和一片叶子可以放入一棵树,树枝分成2 10x。而且因为这个问题是NP完全的,所以当树木生长时,你无法从根本上做出更好的指数增长。

但你可以减少那个指数并且比蛮力做得更好。例如,对于树中的每个节点,记录其下方的最大深度和后代的总数。当您尝试将一棵树放入另一棵树时,只要您尝试使用深度太大或子太多的子树,就停止搜索。这样可以避免造成很多失败的原因。

您也可以使用动态编程来提供帮助。您尝试做的是为两个树中的每对节点存储,无论一个下面的子树是否可以映射到另一个。如果您正在查看a是否可以转到b您首先要做的是将a的孩子映射到b的孩子。如果任何事情都无法解决,那么你知道答案是否定的。如果一切都可以,那么将a的孩子从最小到最适合的位置排序。现在做一个强力搜索如何使一个适合另一个。通过这种组织搜索的方式,您将很快找到死路。

然而,如果树木很大,如果树木不适合另一棵树,那么你可以花很长时间来解决这个问题。