树同构

来自testwiki
imported>卡達2021年1月2日 (六) 08:40的版本 (加入{{Expert needed}}和{{Refimprove}}標記)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

Template:Multiple issues 树同构(Tree Isomorphism)描述的是图论中,两个之间的完全等价关系。在图论的观点下,两个同构的可以被当作同一个图来研究。

定义

树同构的概念源于图同构图同构的概念为,两个简单图GH称为是同构的,当且仅当存在一个将G的节点 1,,n 映射到H的节点1,,n一一对应σ,使得G中任意两个节点ij相连接,当且仅当H中对应的两个节点σ(i)σ(j)相连接。树同构即在以上定义中增加GH都是的限制条件。两颗树T1,T2同构可以记作T1T2

在此基础上,定义有根树及其同构的概念[1]有根树可表示为(T,r),其中T表示一棵树,rV(T)是一个有特殊标记的点,称为树的根结点。对于边xyE(T),若x在根结点到y路径上,称xy父结点yx子结点。有根树的表示形式可以为“种植的树”,即根节点r标有向下箭头;所有结点的子节点都画在该点上方。

有根树同构的定义为,对于两颗有根树(T1,r1)(T2,r2),存在一个同构映射f,其中f(r1)=r2(T1,r1)(T2,r2)同构可记作(T1,r1)(T2,r2)

由以上定义可知,有根树同构的关系严格强于树同构的关系。

有根树同构判定算法

有根树同构的判定问题是P问题P/NP问题)。这里介绍其中一种算法,该算法将有根树的比较转化为字符串的比较。

有根树的0-1编码

对有根树进行0-1编码,并且采用字典序对编码进行比较。字典序的比较方法为: 对不同序列s=s1s2snt=t1t2tm

  • 如果st的初始序列(即t=stitm),则s<t;
  • 如果ts的初始序列(即s=tsisn),则t<s;
  • isiti的最小下标,若si<tis<t,若ti<sit<s

例:00<001,01011<0110

对有根树(T,r)进行如下编码:

  • 所有非根叶结点都赋值为01;
  • 假设点v的子结点w1,w2,,wk都已经完成编码,编码为A(w1),A(w2),,A(wk),且有A(w1)A(w2)A(wk),则v结点的编码A(v)=0A(w1)A(w2)A(wk)1

如此递归。r结点的编码A(r)即为该有根树的编码,用#(T,r)表示。

#(T1,r1)=#(T2,r2),则说明有根树(T1,r1)(T2,r2)同构。

判定定理的简单证明

该算法的判定定理是:(T1,r1)(T2,r2)当且仅当他们具有相同的0-1编码。 对该定理进行如下简单证明:

  • 充分性:从有根树同构的定义和编码过程可证。
  • 必要性:对编码进行解码。任意有根树的编码必然有0S1的一般形式,其中S=S1S2StS1S中0,1个数相等的最小前缀,S2是第二个0,1平衡的最小前缀,以此类推,可以解码出唯一形态的有根树。这棵有根树的其他表示形式都与该解码形式同构。

树同构判定算法

树同构的判定算法基于有根树同构的判定算法构成。在前文所述中,有根树相对于树的区别在于,有根树有一个特定标记的根。对于一般的树,我们需要一种找根的算法;在确定这棵树的有根表达形式之后,对于有根树进行编码判定即可。

定义树的中心点集合C(T):{vT(V,E)|v 是使 maxuTd(u,w) 最小的点 }。由于C(T)至多包含两个顶点,且若C(T)=2,那么该两点必定相邻,故可以选择C(T)中的点为根。

树同构的判定算法中,首先通过删叶子结点的方式,算出C(T)

  • C(T)={r},那么#(T,r)即为树T的编码。
  • C(T)={r1,r2},那么分别计算#(T,r1)#(T,r2),以其中较小的作为树T的编码。

若两棵树的编码相同,即可认为两棵树是同构的。

参考文献