作者系阿里巴巴集团1688技术部普通码农
三元环检测主要思想是先查找所有开三元环(相当于三个节点形成一条链),然后一条边是否可以将这个开三元环闭合(即是否有一条边可以将链的两个端点闭合)。
这里有两个优化点,可以大大提供算法性能。 首先,为了降低计算复杂度,一个三元环,我们只输出一次。如果对三元环中节点排序(最简单的办法就是节点按字母排序),通过逆序或者旋转三元环的节点输出顺序只有一种(例如ABC,BAC, CBA, ACB… 都可以由ABC逆序或者旋转得到)。由于这个性质,每轮mapper reducer过程,输出时候保证节点是按顺序的。 其次,二次爆炸问题,当某一个节点度比较高的时候,那么通过这个节点边就会很多,进而形成的开三元环也会比较多(例如,节点A的度为N,那么通过节点A边有N条边,这N条边任意两条都可以形成一个开三元环,最终A节点将形成N(N-1)/2
个开三元环,当N很大时候性能会有很大影响)。一个解决办法是,使用度较小的节点为key做合并,这样数据被分散到度比较小的节点上。(结合上面的性质,三元环节点序是只有一种,所以不会出现有些三元环没找到的情况)。这两个优化点能大大提高算法性能。
我们以第一节中的图1为例,具体的hadoop算法流程如下
检测三元环算法包含两个MapReducer过程:
四元环检测基本思想与检测三元环类似。可以先找两个开三元环,如果两个开三元环连接相同的两个端点,那么这两个开三元环组成一个四元环。为了减少计算量,我们先分析一下四元环旋转和逆序的性质。先从三元环说起,前面已经提到了。假如三元环顶点有序,那么通过旋转和逆序三元环的顺序是唯一的(ABC,BCA,CAB,CBA,ACB,BAC都可以通过ABC旋转或者逆序得到)。对于四元环四个顶点(A,B,C,D),四个顶点的排列方式有4!=24中,但是通过旋转和逆序只有三种排列方式 (排序方法最简单就是按字母顺序排序)。
如图4所示,我们继续对上面四元环进行分析。根据其中三元环顶点与其邻居节点的关系,我们对上面三个四元环进行分类。首先(a)中两个开三元环(蓝色)的顶点(A,B)比它们相邻的节点(C,D)都小;(b)中两个开三元环(蓝色和黑色),黑色开三元环顶点小于它邻居节点,蓝色开三元环的顶点在邻居节点中间;(c)中两个开三元环(黑色),顶点都在邻居节点中间。所以四元环可以分解成两种三元环的组合:一种三元环,其顶点在两个邻居节点中间,一种三元环,其顶点比邻居节点小。通过这样的策略我们减少开三元环的输出,降低算法的复杂度,后面我们将看到这个策略的应用。
四元环检测算法如下:
a) mapper输入所有的边,分别以边节点为key,边为value的键值,同时对键值对进行标注,标记输出的节点的字母排序(或者其他排序)大小,例如,处理边AF时候, mapper输出值有两个键值对,<A,(AF),L> <F,(AF),H>。第一个值表示key A,键值 AF,L表示A < F (字母序); 第二个值表示key F,键值AF,H表示 F>A(字母序);
b) reducer 处理所有节点对应的开三元环 ,这里注意我们输出两种开三元环:(I)输出节点关联的任意两个L键值对组成的开三元环 (例如,图中C,F对应的两个L键值对,他们组成的开三元环都要输出。如果有三个对以上的L 键值,任意两对组成的开三元环都要输出);(II)输出节点任意一个L键值对和所有的H键值组成的开三元环(例如图中D,F节点)。 【这里就是为什么上面我们分析四元环的组成,因为任意一个四元环只能分解成,两种情况顶点小于两个相邻节点,顶点在两个相邻节点中间。两个L键值对表示的就是顶点小于两个相邻节点,一个L键值和一个H键值表示就是顶点在两个相邻节点中间】
c) 最后一个Reducer就是分析是否两个开三元环的顶点不一样,但是端点一致;是则是四元环;否则不是。
算法流程可以见下图5
k-trusses 桁结构的定义是:a relaxation of a kmember clique and is a nontrivial, single-component maximal subgraph, such that every edge is contained in at least k -2 triangles in the subgraph. 具体理解,桁结构中是由三角结构组成的平面或者立体结构。如下图中(a)是一个4-trusses,而(b)不是4-trusses;(b)是两个3-trusses。桁结构有很多力学性质,在网络社区发现等算法中k-trusses也经常被认为是一簇紧密相连的节点,可以聚为一类。下面我们就来介绍一下,通过hadoop框架来实现k-trusses结构检测的问题。
从上面定义可以发现其实寻找k-trusses问题可以转化为查找三元环问题。同时,由于k-trusses的边满足支撑条件(即k-trusses中的边至少属于k-2 triangles),可以考虑每次删除图中不满足支撑条件的边,检验剩下的图中边是否还满足支撑条件,不断迭代。如果将所有不满足支撑条件的边都去掉,图中剩余的component,就是k-trusses。具体算法如下:
其中step 3,4 是一个MapReducer过程。
具体计算过程如下,假如初始图如下,我们要做4-trusses检测:
基于mapreducer的图算法,布布扣,bubuko.com
原文地址:http://blog.csdn.net/dannypolyu/article/details/38669401