一种高效的分布式大规模动态图k核维护方法与流程

文档序号:12271072阅读:358来源:国知局
一种高效的分布式大规模动态图k核维护方法与流程

本发明属于图形信息检索领域,更具体地,涉及一种高效的分布式大规模动态图k核维护方法。



背景技术:

随着互联网的飞速发展,人类的社会活动越来越网络化。人与人、人与实体之间关系被抽象成图,其中顶点表示人或者实体,边表示关系。在我们生活中充满了各种各样的图结构,微博、微信等社交网络,航班、火车、地铁等交通网络图,电商购物平台中商家商品和用户构成的买卖关系网络图,科研合作和论文引用网络图等等。这些网络图规模越来越大,数据越来越复杂,分析的难度也逐渐加大。因此直接对整个网络结构进行分析的难度很大,通常的做法是提取网络中的重要结构进行分析。其中最主要的一个工作是检测图中相互关系十分紧密的顶点所构成的紧密子图。而K核是一个强有力的标准来衡量复杂网络中一组顶点之间的紧密性。网络中节点度至少为k的极大子图构成图的k核。当一个节点属于K核,但不属于K+1核时,它的核数为k。K核分解的过程就是求出图中每个节点的核数。K核值越大的节点越靠近图的中心,在网络中的所处的地位越重要比传统研究中考虑的度数大的节点对于图的拓扑性质以及网络中信息的传播所起的作用要大。除了分析子图的紧密性,K核分解还被用于大规模网络的可视化、识别网络中最有影响力的传播者、社区发现等等。

在许多现实生活的应用中,例如社交网络和互联网拓扑结构,都是会随着时间的变化发生变化。在这样的动态网络中,许多应用需要实时的维护每个节点的核数。例如在一个基于k核的网络可视化中,图结构随着用户的增减而变化,可视化算法便需要实时更新每个顶点的核数来动态的显示图结构。然而,在一个动态网络中实时更新k核是十分困难的。因为插入或者删除一条边可能会让该条边的端点核数增加或者减少1,但是这个端点的核数更新可能会传播至其邻居顶点,邻居顶点再传播至邻居顶点,以至于最后甚至传遍整个网络。

现有的计算k核的算法大多集中在静态图上,计算图中所有顶点的核数。已有的关于动态图k核更新的方法,要么不够高效,复杂度过高,计算开销大,要么基于单机的计算,难于扩展至分布式方法,无法适用于大规模图数据。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种高效的分布式大规模动态图k核维护方法及系统,其目的在于采用迭代的计算框架,采用分布式思维,以动态图中每个顶点为最小单位,结合每个顶点的邻居顶点信息快速更新其真实核数,由此解决现有技术解决更新动态图k核过于复杂,开销过高,无法扩展分布式计算的问题。

为实现上述目的,按照本发明的一个方面,提供了一种高效的分布式大规模动态图k核维护方法,该方法包括静态k核维护子方法、插入边时k核维护子方法和删除边时k核维护子方法:

其中静态时k核维护子方法包括以下步骤:

(11)将图中所有顶点的当前核数初始化为自身的度数,并将当前核数信息传递给其邻居顶点,再将所有顶点加入任务队列;

(12)若队列为空,则结束流程;否则从任务队列中移除一个顶点,并求出此顶点的估算核数;

(13)若此顶点估算核数小于当前核数,则该顶点的最终核数为估算核数,再把最终核数传递给该顶点的邻居顶点,并将该顶点再次加入任务队列,并返回步骤(12);否则直接返回步骤(12)。

进一步地,所述步骤(12)中求各个顶点的估算核数值具体包括以下子步骤:

(121)当前顶点核数记为core_v,初始化数组count大小为core_v,数组内每个元素值为0;

(122)若当前顶点v还有未被访问的邻居顶点u,则选取core_u和core_v中较小的一个记为j,并且使数组count[j]增加1,之后返回到步骤(122);否则进入步骤(123);

(123)初始化为i=core_v;若i>2,则count[i-1]=count[i-1]+count[i],之后i=i-1,返回步骤(123);否则进入步骤(124);

(124)赋值i=core_v;

(125)若i>1,count[i]<i,则i=i-1,返回步骤(125);否则当前顶点的估算核数值即为i,结束流程。

其中插入边时k核维护子方法包括以下步骤:

(31)将图中每个顶点的当前核数初始化为自身的度数,初始化每个顶点的访问标志位visited为0,移除标志位removed为0,计算每个顶点的最大核度数(MCD)和纯核度数(PCD):

MCD(v)=|{u∈neighbor(v)|K(u)≥K(v)}|,

PCD(v)=|{u∈neighbor(v)|K(u)=K(v)∧MCD(u)>K(v)orK(u)>K(v)}|,

其中,顶点u是顶点v的邻居顶点,K(u)表示顶点u的核数,K(v)表示顶点v的核数;

(32)对于插入的边<U,V>,选取核数较小的顶点作为根顶点root,根顶点root的核数为K;

(33)初始化根顶点root,使根顶点当前核数cd(root)等于PCD(root),visited[root]=1,并将根顶点root加入任务队列;

(34)若任务队列为空,则将所有满足visited[v]=1,removed[v]=0条件的顶点v的最终核数值等于K+1,结束流程;否则进入步骤(35);

(35)从任务队列中移除的一个顶点为v,若顶点v的当前核数cd(v)>K,则进入步骤(36),否则进入步骤(38);

(36)若v还有未被访问过的邻居顶点u,则进入步骤(37);否则结束流程;

(37)若邻居顶点u满足其最终核数k(u)=K,并且u的最大核度数MCD(u)>K,并且visited[u]=0,则将顶点u加入任务队列,并且使visited[u]=1,cd(u)=cd(u)+PCD(u),之后返回步骤(36);否则直接返回步骤(36)

(38)判断顶点removed[v]=0是否成立,是则使removed[v]=1,进入步骤(39),否则结束流程;

(39)若顶点v还有未被访问过的邻居顶点u,则进入步骤(40);否则结束流程;

(40)若顶点u的最终核数K(u)等于K,则使u的当前核数值cd(u)=cd(u)-1,进入步骤(401);否则返回到步骤(39);

(401)判断cd(u)=K,并且removed[u]=0是否成立,若成立则将顶点u作为新的顶点v,返回步骤(38);否则返回步骤(39)。

其中删除边时k核维护子方法包括以下步骤:

(41)将图中所有顶点的当前核数初始化为0,初始化每个顶点的访问标志位visited为0,解散标志位dismissed为0,计算每个顶点的最大核度数(MCD)和纯核度数(PCD);

(42)对于删除的边<U,V>,选取U和V中核数较小的顶点作为根顶点root,根顶点root的核数为K;

(43)当删除边的顶点U和顶点V的核数相等时,赋值visited[U]=1,cd[U]=MCD[U],若cd[U]<K,则将顶点U加入任务队列,之后进入步骤(44);否则直接进入步骤(44);

(44)更新visited[V]=1,cd[V]=MCD[V];若cd[U]<K,并且dismissed[v]=0则将顶点V加入任务队列,进入步骤(46);否则直接进入步骤(46);

(45)当删除边顶点U和顶点V的核数不相等时,更新visited[root]=1,cd[root]=MCD[root],将顶点root加入任务队列,若cd[root]<K,则进入步骤(46);否则直接进入步骤(46);

(46)若任务队列为空,则结束流程;否则设从任务队列开始进行递归移除操作的当前顶点为u,解散标志位dismissed[u]等于1,最终核数值K(u)=K(u)-1,之后进入步骤(47);

(47)若顶点u还有未遍历的邻居顶点,则进入步骤(48);否则返回步骤(46);

(48)若邻居顶点w的最终核数K(w)=K,则进入步骤(49);否则返回步骤(46);

(49)若访问标志位visited[w]=0,则当前核数cd(w)=cd(w)+PCD(w),并且visited[w]=1,之后进入步骤(50);否则直接进入步骤(50);

(50)更新w的当前核数cd(w)=cd(w)-1;

(501)若cd(w)<K并且dismissed[w]=0,则将w加入任务队列,回到步骤(46);否则直接回到步骤(46)。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下技术特征及有益效果:

(1)本发明考虑图数据动态变化的过程,结合k核计算的特点,对于每次插入或者删除边的情况,能够快速找到核数发生更新的顶点;

(2)本发明采用迭代的计算框架,通过任务队列的形式实现顶点维护自己核数的操作,充分考虑顶点的邻居信息,并且每个顶点只用访问这些邻居信息,便于扩展至进行分布式计算,可以处理单机难以计算的大规模图数据。

附图说明

图1是k核分解计算的流程图;

图2是估算核数值的流程图;

图3为在图中插入边时k核更新的流程图;

图4为插入边时判断一个顶点是否需要更新核数的流程图;

图5为在图中删除边时k核更新的流程图;

图6为删除边时对任务队列中的点进行递归移除的流程图;

图7为在图中插入边后找到的k核需要更新的顶点集合;

图8为在图中删除边后找到的k核需要更新的顶点集合。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

如图1为静态时k核维护的流程图,包括以下步骤:

(11)将图中所有顶点的当前核数初始化为自身的度数,并将当前核数信息传递给其邻居顶点,再将所有顶点加入任务队列;

(12)若队列为空,则结束流程;否则从任务队列中移除一个顶点,并求出此顶点的估算核数;

(13)若此顶点估算核数小于当前核数,则该顶点的最终核数为估算核数,再把最终核数传递给该顶点的邻居顶点,并将该顶点再次加入任务队列,并返回步骤(12);否则直接返回步骤(12)。

如图2是估算核数值的流程图,包括以下步骤:

(121)当前顶点核数记为core_v,初始化数组count大小为core_v,数组内每个元素值为0;

(122)若当前顶点v还有未被访问的邻居顶点u,则选取core_u和core_v中较小的一个记为j,并且使数组count[j]增加1,之后返回到步骤(122);否则进入步骤(123);

(123)初始化为i=core_v;若i>2,则count[i-1]=count[i-1]+count[i],之后i=i-1,返回步骤(123);否则进入步骤(124);

(124)赋值i=core_v;

(125)若i>1,count[i]<i,则i=i-1,返回步骤(125);否则当前顶点的估算核数值即为i,结束流程。

如图3和图4为在图中插入边时k核更新的流程图,包括以下步骤:

(31)将图中每个顶点的当前核数初始化为自身的度数,初始化每个顶点的访问标志位visited为0,移除标志位removed为0,计算每个顶点的最大核度数(MCD)和纯核度数(PCD):

MCD(v)=|{u∈neighbor(v)|K(u)≥K(v)}|,

PCD(v)=|{u∈neighbor(v)|K(u)=K(v)^MCD(u)>K(v)orK(u)>K(v)}|,

其中,顶点u是顶点v的邻居顶点,K(u)表示顶点u的核数,K(v)表示顶点v的核数;

(32)对于插入的边<U,V>,选取核数较小的顶点作为根顶点root,根顶点root的核数为K;

(33)初始化根顶点root,使根顶点当前核数cd(root)等于PCD(root),visited[root]=1,并将根顶点root加入任务队列;

(34)若任务队列为空,则将所有满足visited[v]=1,removed[v]=0条件的顶点v的最终核数值等于K+1,结束流程;否则进入步骤(35);

(35)从任务队列中移除的一个顶点为v,若顶点v的当前核数cd(v)>K,则进入步骤(36),否则进入步骤(38);

(36)若v还有未被访问过的邻居顶点u,则进入步骤(37);否则结束流程;

(37)若邻居顶点u满足其最终核数k(u)=K,并且u的最大核度数MCD(u)>K,并且visited[u]=0,则将顶点u加入任务队列,并且使visited[u]=1,cd(u)=cd(u)+PCD(u),之后返回步骤(36);否则直接返回步骤(36)

(38)判断顶点removed[v]=0是否成立,是则使removed[v]=1,进入步骤(39),否则结束流程;

(39)若顶点v还有未被访问过的邻居顶点u,则进入步骤(40);否则结束流程;

(40)若顶点u的最终核数K(u)等于K,则使u的当前核数值cd(u)=cd(u)-1,进入步骤(401);否则返回到步骤(39);

(401)判断cd(u)=K,并且removed[u]=0是否成立,若成立则将顶点u作为新的顶点v,返回步骤(38);否则返回步骤(39)。

如图5和图6为在图中删除边时k核更新的流程图,包括以下步骤:

(41)将图中所有顶点的当前核数初始化为0,初始化每个顶点的访问标志位visited为0,解散标志位dismissed为0,计算每个顶点的最大核度数(MCD)和纯核度数(PCD);

(42)对于删除的边<U,V>,选取U和V中核数较小的顶点作为根顶点root,根顶点root的核数为K;

(43)当删除边的顶点U和顶点V的核数相等时,赋值visited[U]=1,cd[U]=MCD[U],若cd[U]<K,则将顶点U加入任务队列,之后进入步骤(44);否则直接进入步骤(44);

(44)更新visited[V]=1,cd[V]=MCD[V];若cd[U]<K,并且dismissed[v]=0则将顶点V加入任务队列,进入步骤(46);否则直接进入步骤(46);

(45)当删除边顶点U和顶点V的核数不相等时,更新visited[root]=1,cd[root]=MCD[root],将顶点root加入任务队列,若cd[root]<K,则进入步骤(46);否则直接进入步骤(46);

(46)若任务队列为空,则结束流程;否则设从任务队列开始进行递归移除操作的当前顶点为u,解散标志位dismissed[u]等于1,最终核数值K(u)=K(u)-1,之后进入步骤(47);

(47)若顶点u还有未遍历的邻居顶点,则进入步骤(48);否则返回步骤(46);

(48)若邻居顶点w的最终核数K(w)=K,则进入步骤(49);否则返回步骤(46);

(49)若访问标志位visited[w]=0,则当前核数cd(w)=cd(w)+PCD(w),并且visited[w]=1,之后进入步骤(50);否则直接进入步骤(50);

(50)更新w的当前核数cd(w)=cd(w)-1;

(501)若cd(w)<K并且dismissed[w]=0,则将w加入任务队列,回到步骤(46);否则直接回到步骤(46)。

如图7-8所示,以具体实例对本发明一种高效的分布式大规模动态图k核维护方法进行进一步说明:

计算顶点核数:

(1)图中共有18个顶点,编号为1-18,所有顶点核数初始化为它的度数,则顶点核数初始值为{2,4,6,4,5,5,6,3,2,3,3,2,4,5,4,3,4,3},每个顶点将核数值传递给邻居;

(2)顶点根据从邻居获取的核数,估算自己的核数,得到新的核数估计值为{2,3,4,4,4,4,4,3,3,2,2,2,2,3,3,3,3,3},其中顶点2,5,6,7,8,10,11,13,14,15,17的核数估计值比当前核数值小,将新的核数值传递给邻居,并加入任务队列;

(3)从任务队列中依次取出顶点,再一次进行核数估计,这一次得到顶点2,5,6,7,8,10,11,13,14,15,17的核数估计值为{2,4,4,4,2,2,2,2,3,3,3},所有顶点的核数估计值都等于当前核数值,没有顶点发生更新,任务队列为空,算法结束,所有顶点核数依次为{2,2,4,4,4,4,4,2,2,2,2,2,2,3,3,3,3,2}。

插入边<v9,v10>:

(1)初始化所有顶点的核数和状态位,每个顶点的标志位visited为0,removed为0,计算每个顶点的MCD值和PCD值,得到MCD为{2,4,4,4,4,4,4,3,3,4,3,2,4,3,3,3,3,3},PCD值为{2,3,0,0,0,0,0,3,3,4,2,2,3,0,0,0,0,3},cd值初始化为0;

(2)对于插入的边<v9,v10>,其中v9核数较小,作为root,K的值等于v9的核数2,visited[v9]置1,cd[v9]=PCD[v9]=3把根顶点root加入队列;

(3)任务队列不为空,从队列中取出队首顶点v9,cd[v9]=3,大于K的值2,开始访问v9的邻居;

(4)对于v9的邻居v5和v6,K(v5)=4,K(v6)=4,MCD(v5)=0,MCD(v6)=0,都不大于K,不执行任何操作;取下一个邻居v10,K(v10)=2,MCD(v10)=4>K,并且v10没有被访问过,将v10加入任务队列,访问标志位置1,cd[v10]=cd[v10]+PCD[v10]=4,v9的邻居访问完;

(5)从任务队列中取出下一个顶点v10,遍历v10的邻居,其中v9被访问过,v8,v11,v18的核值等于2,MCD值大于2,且没有被访问过,将访问标志位置1,更新cd[v8]=3,cd[v11]=2,cd[v18]=3,并加入任务队列,当前任务队列为{v8,v11,v18};

(6)从任务队列中取出下一顶点v8,cd[v2]=3大于K,遍历v8的邻居,对于v2,k[v2]=2,MCD[v2]=4大于K,并且v2没有被访问过,将v2访问位置1,加入任务队列,更新cd[v2]=3;对于v7,k[v7]=4,不加入任务队列;对于v10,v10被访问过,不进行其他操作;当前任务队列为{v11,v18,v2};

(7)从任务队列中取出v11,cd[v11]=2不大于K,removed[v11]不为1,执行5.3,removed[v11]=1,cd[v10]=3,cd[v12]=-1,cd[v13]=-1;

(8)从任务队列中取出v18,cd[v18]=3大于K,对v18的邻居,v10访问过,而cd[v14]=3,cd[v17]=3不加入任务队列;

(9)从任务队列中取出v2,cd[v2]=3大于K,对于v2的邻居v1,v3,v7,v8不满足K(w)=K且MCD(w)>K,都不加入任务队列;

(10)任务队列为空,最后顶点v2,v8,v9,v10,v18满足访问标志位为1且移除标志位为0,核数发生更新,由2更新至3,算法结束。

删除边<v9,v10>:

(1)初始化所有顶点的核数和状态位,核数依次为{2,3,4,4,4,4,4,3,3,3,2,2,2,3,3,3,3,3},每个顶点的标志位visited为0,dismissed为0,计算每个顶点的MCD值和PCD值,得到MCD为{2,3,4,4,4,4,4,3,2,2,3,2,4,4,3,3,4,3},PCD值为{2,2,0,0,0,0,0,1,2,0,2,2,3,1,2,2,1,2},cd值初始化为0对于删除的边<v9,v10>,v9v10核数相等,v9作为root,K=3;

(2)K(v9)=K(v10)=3,先从v9开始更新,置visited[v9]=1,cd[v9]=MCD[v9]=2,小于K,则从v9开始执行递归移除操作,K(v9)自减1为2,dismissed标志位置1,遍历v9的邻居{v5,v6},v5,v6的核数都不等于3,不进行其他操作;

(3)再对v10进行更新,visited[v10]=1,cd[v10]=MCD[v10]=2,v10满足dismissed[v10]为0并且cd[v10]<K,将v10加入任务队列;

(4)置dismissed[v10]=1,K(v10)自减1为2,遍历v10的邻居{v8,v11,v18},首先v8满足K(v8)=3等于K且visited[v8]=0,则cd[v8]=cd[v8]+MCD[v8]为3,visited[v8]置1,cd[v8]自减1为2,cd[v8]满足小于K且dismissed[v8]=0,则,将v8加入任务队列;

(5)置dismissed[v8]=1,K(v8)自减1为2,对v8的邻居{v2,v7,v10},v2满足K(v2)=3等于K,且visited[v2]=0,更新cd[v2]为3,置visited[v2]为1,cd[v2]自减1为2,满足小于K且dismissed[v2]=0,则将v2加入任务队列,遍历v2的邻居;

(6)置dismissed[v2]=1,K(v2)自减1为2,对v2的邻居{v1,v3,v7,v8},核数都不等于K,v2邻居访问完;

(7)继续访问v8的邻居v7核数不等于K,v10访问过,v8邻居访问完;

(8)继续访问v10的邻居v11,K(v11)=2不等于K,无操作;对v10的下一个邻居v18满足K(v18)=3等于K且visited[v18]=0,则更新cd[v18]=3,置visited[v18]为1,再更新cd[v18]=2,cd[v18]满足小于K且dismissed[v18]=0,则将v18加入任务队列;

(9)置dismissed[v18]=1,更新K(v18)为2,遍历v18的邻居,对于v14满足K(v14)=3等于K,且visited[v14]=0,更新cd[v14]为3,不小于K,无其他操作;下一个邻居v17,满足K(v17)=3等于K且visited[v14]=0,更新cd[v17]为3,不小于K,无其他操作,v18的邻居访问完成;

(10)任务队列为空,算法结束,顶点v2,v8,v9,v20,v18的核数发生更新,由3减少为2。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1