[英]How to solve Subtree Isomorphism using maximum bipartite matching?
我们如何确定给定的树T是否包含与另一个树S同构的子树?
如果其中一个树可以通过一系列翻转从其他树中获得,即通过交换多个节点的左右子节点,则将两个树称为同构。 任何级别的任意数量的节点都可以交换子节点。 两棵空树是同构的。
我在几个地方读过,可以使用二元匹配算法来解决这个问题,但是我找不到任何非支付来源的细节。 似乎有很多关于这个问题的研究论文,其中大部分都是在付费墙之后,但我目前对这个问题的最新研究算法并不感兴趣。 我的问题是两联匹配如何应用于这个问题?
PS:互联网上似乎有一些关于“同构”含义的混淆。 上面是我在大多数地方发现的定义,但是一些提到“同构”的地方意味着无论节点值如何,树都具有相同的形状。 如果有人能够清除这种困惑,那也很棒。
我将谈论有根的子树同构; 通过尝试所有根源,可以在不考虑效率的情况下处理无根的情况。
基本的想法是,如果你有树木
A B
/|\ /|\
/ | \ / | \
/ | \ / | \
a1 ... am b1 ... bn
/\ /\ /\ /\
并且想要知道A
是B
的子树,以便A
映射到B
,然后对于所有i
和j
,递归计算是否以ai
为根的子树是否是以这种方式植入bj
的树的子树那个ai
映射到bj
。 (基本情况是当A
或B
是叶子时。)现在,每个子树都是可映射的是不够的,因为如果某些bj
具有特别丰富的结构,那么几个ai
可能是子树,但是同构的要求赢了“让他们分享那个bj
。 这是最大匹配的来源:我们尝试将所有ai
与bj
匹配,以便可以映射子树。
要做一般的根本问题,请尝试所有可能的B
选择。
看到这里 ,有一个子树同构的C#实现。 一个蛮力的,我是编码员:)希望它可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.