【问题标题】:Unordered Tree Pattern Matching Algorithm无序树模式匹配算法
【发布时间】:2017-08-28 17:21:00
【问题描述】:

我正在尝试找到一种合理的算法,在无序的有根树中找到第一个匹配的树模式。根据some research我遇到过,这个问题是NP-Complete。我不需要找到每个模式匹配,我只需要找到任何存在的模式匹配。最好,我宁愿不必在我的树上执行“删除”(我也不想复制来删除节点)。

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

根据我提到的标准,有没有一种简单的算法可以解决这个问题,但仍然比纯朴素的蛮力方法更好?

注意,我的问题类似于 this previously asked question,但这个问题是针对有序树的。

【问题讨论】:

  • “树匹配”是什么意思?是否要弄清楚一棵树何时与另一棵树具有相同的形状?还是要弄清楚一棵树何时可以适应另一棵树的形状?还是别的什么?
  • 如果不考虑,似乎这个问题将是NP完全的,因为在多次分配时很难确定哪个模式子树与哪个输入子树匹配是可能的。顶点覆盖或其他东西会减少。也许您的现实生活中的某些问题可以让您不必为此担心?
  • @btilly 我编辑了我的问题,我指的是我在问题中引用的文章介绍中定义的树模式匹配。

标签: algorithm tree pattern-matching


【解决方案1】:

根据http://www.sciencedirect.com/science/article/pii/S1570866704000644,NP 完全问题是树包含。这意味着这棵树可以适应潜在的跳过世代。因此,例如,一棵具有一个根和 1000 片叶子的树可以适合一棵以 2 10 倍分枝的树。而且因为这个问题是 NP 完全的,所以随着树的生长,你不能从根本上实现更好的指数增长。

但是您可以减少该指数并且比蛮力做得更好。例如,对于树中的每个节点,记录其下方的最大深度和后代的总数。当您尝试将一棵树拟合到另一棵树时,当您尝试拟合具有太多深度或太多子树的子树时,请停止搜索。这将使您避免追随很多失败的原因。

您还可以使用动态编程来提供帮助。您尝试做的是为来自两棵树的每一对节点存储是否可以将一个下面的子树映射到另一个。当您查看a 是否可以转到b 时,您首先要做的是将a 的子代映射到b 的子代。如果有一个不能去,那么你知道答案是否定的。如果一切顺利,那么将a 的孩子从最不适合的地方排序到最多的地方。现在做一个蛮力搜索如何将一个适合另一个。通过这种组织搜索的方式,您往往会很快找到死胡同。

但是,如果树很大,如果一棵不适合另一棵,您可能会花费非常非常长的时间来弄清楚这一事实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多