1.子图同构问题描述
首先描述一下子图同构是什么意思,一个图由一系列节点和一系列连接节点的边构成,节点和边都可以有标签,也就是可以给他们按属性分类。
精确点:一个图
现在给定两个图
如果以下6个条件成立,则这两个图是子图同构的。
用人话来解释一下:
- 对于小图中每个节点,大图中都要有一个对应的节点与之对应,并且这样一对一对的节点构成了集合
;
- 小图中任意两个不一样的节点,他们对应的大图中的节点不能是同一个;
- 小图中每条边,大图中都有一条边与之对应,并且他们两端的节点一一对应;
- 小图中任意两个节点,如果他们对应的大图中的节点之间有一条边,那么小图中这两个节点之间也得有条边;
- 每对对应节点的label要相同,也就是这俩节点类型或属性相同;
- 每对对应边的label要相同,也就是说这俩边的类型或属性相同。
综上所述,子图同构简单来说就是,大图中有一个子结构,长得跟小图一模一样,而且这个子结构的节点之间不能多出小图中不存在的边来,如果要去掉最后这个而且,就把上面第4个条件去掉~
2.VF3算法
VF3算法的目标是,给定一个小图和一个大图,找出大图中所有与小图同构的子图,这是一个NP-hard问题。整体上,VF3算法是一个树搜索算法,并且想办法去尽可能剪枝。搜索树上的每个节点都是一个状态(state),记为
那么现在最大的问题就是两个:
- 这棵搜索树怎么组织?
- 怎么设计剪枝规则?
下面逐个展开~
A. 总体流程介绍
先来介绍一些符号:
大致看一下整个流程,上伪代码~
VF3总流程
1:
2:
3:
4:
5:
6: