《A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs》论文总结
来源:互联网 发布:同志交友软件blued2015 编辑:程序博客网 时间:2024/06/08 10:36
子图同构的概念我们已经介绍过,使用ULLMANN算法的解决方式请看我的前一篇博客 《An Algorithm for Subgraph Isomorphism》论文总结。今天要说的是VF2算法,对子图同构问题的处理效率更高,适合于图的size很大,即点数很多的的large graph,在最后的测试中,算法的性能几乎与点的数目无关。但是根据我的测试和boost库中对VF2的实现来看,两个算法对于同构的标准并不相同,VF2更加严格,这点我还有疑问,
论文:http://www.docin.com/p-1760455871.html。
首先是算法的原理。这是论文中给出的伪代码:
算法求同构的方法就是不断扩展s,不断扩展状态,当状态扩展到小图的规模的时候,就说明求得了一个同构,如果状态没到预定的规模,那么需要继续依照规则扩展s。论文里把这种方法叫做SSR, State Space Representation.状态s代表的是图1和图2中已经确认同构的部分,这里图1是targetGraph,大图。图2是queryGraph,小图。算法的输出是是否能在大图中找到一个小图。对于图1,已经在s中的点的集合是G1s,图2中在s中的点的集合是G2s。G1s和G2s是同构的(注意这里的词是同构而不是子图同构,也就是说,G1s和G2s的点数目是一样的,G1s中有的边,G2中也有,并且反过来也是)。
扩展s的的方法是这样,首先计算所有可以加入到s中的点对P(s)(计算P(s)的方法稍后提到),然后对于P(s)中的一个点对计算它的可行性(计算的方法也稍后提到),如果这个点对p是可行的,那么就扩展s。当然在实际的代码中还要设计回退的过程。
计算P(s)的方法看论文就可以,先看两张图中已经在s里点的一步终点邻接点,再看已经在s里的点的一步源点邻接点。如果是连通图,那么必然此时可以构建P(s)了,但是如果是非连通图,那么就可能这两个集合都是空的。此时就只能在unmapped点中进行两两组合了。
判断P(s)对于当前state的可行性的方法如下:
前两条规则保证加入了p以后,s依然是同构的。第3第4条规则确定这个s能否再扩展出儿子,原文的说法是k-look-ahead rules,这里的k就是1.第5条规则是看这个s能否扩展出孙子,是2-look-ahead rule。先看前2条规则,它要求G1中有的边G2中也要有,反过来也是。这就是说两张图是induced同构的,这个概念是这样的,摘自维基百科:
在论文原文中并没有induced这个词,5条规则却是求induced subgraph isomorphism的,让我还有疑问。
第3和第4条和第5条规则的含义就是说大图中点在规定集合里的度数要比小图大,这个很好理解。第五条统计的度数是即将因为p会在下一次被考虑到的点。第五条也是保证induced才用得到的。
对于VF2的性能,的确和边的数目没有关系,论文里说和state的状态有关系,其实就是和边的数目有关系。
如果想要把VF2的同构规则改成ULLMANN的规则的话,只需要将五条规则的前两条改造,第五条去掉即可。
下面的链接是boost库对于VF2的实现,boost对于VF2的说明很明确的用了induced这个词。
总结:其实说实话我一开始对于VF2论文突然给出的一句算法用时和图的size是almost没有关系的很惊讶,效果更好也不用好到这么夸张吧。但是仔细想想的确如此,它和边的数目成比例,所以它对于稀疏图的效果肯定很好。说它比ULLMANN算法更高效,参考网上我看过的博客,原因就是具体问题具体分析了。ULLMANN算法中的搜索顺序没有利用到图的性质,只是把度数大的点往前提,尽可能的剪枝。VF2中让每次剪枝时被考虑到的点、边更多,自然被剪掉的也就更多,能早点发现问题。
博客写的有些乱,是我看完论文的感想,不是对于论文的解释。放在这里是希望和大家交流,写的乱望海涵,先看论文再看这个比较好。
最后是我的C++实现代码,参考了http://blog.csdn.net/luo123n/article/details/49787183这篇博客中的JAVA实现。我也对他提出了一些问题,在评论里。
- 《A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs》论文总结
- 《An Algorithm for Subgraph Isomorphism》论文总结
- Pregel: A System for Large-Scale Graph Processing【转】
- Pregel: A System for Large-Scale Graph Processing(译)
- Pregel: A System for Large-Scale Graph Processing
- Pregel: A System for Large-Scale Graph Processing(译)
- Pregel: A System for Large-Scale Graph Processing(译)
- Pregel: A System for Large-Scale Graph Processing(译)
- A Dynamic Algorithm for Local Community Detection in Graphs--阅读笔记
- Inductive Representation Learning on Large Graphs 论文阅读
- 用于图匹配和对象发现的挖掘与或图Mining And-Or Graphs for Graph Matching and Object Discovery
- 讲座:网络科学徜徉 sub-modular,large graphs,计算与存储支撑
- Prege(图计算框架)l: A System for Large-Scale Graph Processing(译)
- 知识图谱3-【看一篇论文《Graph-Based Wrong IsA Relation Detectionin a Large-Scale Lexical Taxonomy》】
- egypt - a tool for making call graphs
- A Large-Scale Car Dataset for Fine-Grained Categorization and Verification论文笔记
- 论文笔记 A Large Contextual Dataset for Classification,Detection and Counting of Cars with Deep Learning
- 论文笔记之Learning Convolutional Neural Networks for Graphs
- Redis入门
- golang-mysql数据库简单操作
- 链表问题---在单链表中删除指定值的节点
- JAVA程序员技术栈、业务栈、工具栈
- Python2和Python3共存时安装BeautifulSoup4
- 《A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs》论文总结
- 找出字符数组中出现次数最多的字符
- Python之DataFrame常用方法小结
- PCA实现流程
- ADV-231-扑克排序
- java定时利用QQ邮件发送今日头条关于java的内容
- const,static,extern的不同
- <几天一题>插入排序
- 树莓派3B+ Git服务(GitLab)