【问题标题】:What's the Difference Between Subgraph Isomorphism and Subgraph Monomorphism?子图同构和子图单态有什么区别?
【发布时间】:2010-10-02 08:49:43
【问题描述】:
在我参与的一个项目中,主题为isomorphism versus monomorphism came up。
一点背景知识:我不是图论专家,也没有接受过正规培训。但这个主题在化学中非常重要,化学家希望在他们使用的结构搜索系统中发生特定类型的子图匹配。
如果目标图 A 有 n 个节点和 m 条边,那么化学家将接受子图匹配,其中查询图 B 有 n 个节点和 m-1 条边。唯一的要求是 B 中的每条边都应该出现在 A 中。例如,6 个节点的线性链应该匹配 6 个节点的循环。
这种匹配是同构还是单态?也许完全是别的东西?
【问题讨论】:
标签:
subgraph
isomorphism
monomorphism
【解决方案1】:
令G1、G2分别为由顶点集和边集V1、V2和E1、E2组成的图。
G2 同构于 G1 的子图,当且仅当 V2 的每个顶点与 V1 中的顶点之间以及 E2 中的每条边与 E1 中的某条边之间存在一对一映射。所以要同构,你需要有一个完全匹配,包括如果图在节点之间包含多个边。
G2 是单态的,如果顶点之间存在这样的映射,并且在 V2 中的所有顶点之间存在一条边,并且在 V1 中存在一条对应的边。但只要存在至少一条边就足够了。
这是来自comp.lang.python 的不错的软件包描述。
【解决方案2】:
单态。
从一个图(“B”)到另一个图(“A”)的单态等价于从 B 到 A 的子图的同构。
这个例子是说任何 n 顶点路径(“链”)对于 n 顶点循环都是单态的。对于 n+1 个顶点循环,它也可以是单态的,或者对于任何 k 都是 n+k。
【解决方案3】:
当顶点上的 h 是单射函数时,一个无向图同态 h: H -> G 被称为单态。作为图同态,h当然将边映射到边,但并不要求边h(v0)-h(v1)反映在H中。
有向图的情况类似。
【解决方案4】:
这里的数学和 CS 术语之间存在差异。
从数学中你得到两个术语:
子图同构:
设 H = (VH, EH) 和 G = (V, E) 是图。 f : VH → V 是一个子图同构如果 (u, v) ∈ EH, 那么 (f(u), f(v)) ∈ E。
H 同构于 G 的子图
诱导子图同构:
设 H = (VH, EH) 和 G = (V, E) 是图。 f : VH → V 是一个诱导子图同构如果 (u, v) ∈ EH, 那么 (f(u), f(v)) ∈ E. 如果 (u, v) 不是 EH 的元素,那么 ( f(u), f(v)) 不是 E 的元素。
H是G的诱导子图的同构
来自http://theory.stanford.edu/~virgi/cs267/lecture1.pdf 的定义。
它们等同于我在“图论第一课”中找到的内容。
请注意,这两者都是图之间的单射同态,也就是图单态。
转向 CS,特别是子图同构问题。据我所知,子图同构算法从上面确定是否存在满足 (2) 的函数。
图单态匹配 (1)。
CS 定义来自 VF2 算法,我不知道这种用法有多普遍。在为项目搜索正确算法时,似乎仍然存在一些歧义,并且并非所有项目都使用相同的定义。
对这个答案持保留态度http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.101.5342&rep=rep1&type=pdf
在介绍中将单态与图子图同构分开,但在第 2 节中将图子图同构定义为在概念上与 (1) 相同,这表明我遗漏了一些东西。