本发明属于分布式计算技术领域,更具体地,涉及一种亚线性时间分布式计算围长的最小社区发现方法。
背景技术:
图g是一个由结点集合v和边的集合e组成的简单图。图可以刻画现实世界中实体之间的关系,例如在社交网络中表示人与人之间的关系;在交通网络或者航空网络中描绘两个点之间的可达性或者用于设计最优的路线;工作的分配,工程进度的安排或者课程表的制定都可以利用有向图来进行建模。因此,图算法的设计是计算机科学中的一项重要课题。
图的围长表示的是图中最小的环的大小。它是图算法的一个基本问题,当应用到社交网络分析时,拥有最小长度的环即为最小社区,围长=最小社区的大小-1。在分布式算法中,最棘手的问题是如何处理拥塞。在目前分布式领域中,最常用的模型为拥塞模型(congestmodel),它要求图中每条边在每一轮中最多传递一个消息。这给算法的设计带来了巨大的挑战,它要求我们设计合适的策略去传递和路由消息,保证图中没有拥塞发生。这个挑战使得简单的利用宽度优先搜索算法计算围长需要很高的时间复杂度,而在这种方法下降低时间复杂度又会引入计算错误。
技术实现要素:
针对现有技术的缺陷,本发明的目的在于解决如何快速而正确地发现社交网络中的最小社区的技术问题。
为实现上述目的,第一方面,本发明实施例提供了一种亚线性时间分布式计算围长的最小社区发现方法,该方法包括以下步骤:
步骤s0.将社交网络抽象为社交网络平面图;
步骤s1.找出社交网络平面图里所有连通子图;
步骤s2.根据所有连通子图信息,找出每个连通子图的分割层;
步骤s3.对于每个连通子图,从分割层出发逐层递进,寻找该连通子图分割层内的分离集;
步骤s4.根据找到的分离集,以该集合中的每个节点为根节点,构建对应的bfs树,并行计算每个节点的最短环路长度;
步骤s5.汇聚分离集中的所有点的最短环路长度,平面图的围长为其中最小值,拥有最小长度的环即为最小社区。
具体地,步骤s0具体为:将社交网络抽象为社交网络平面图,节点为社交网络中的人,边为人与人之间的关系。
具体地,步骤s1具体包括以下步骤:
s11.对社交网络平面图进行一次遍历,按照遍历顺序给社交网络平面图中每个节点一个唯一数值标号idi,i=1,2,…,n,n为社交网络平面图的总节点数;
s12.初始化每个节点vi的属性ci为ci=idi;
s13.社交网络平面图中所有节点并行进行分布式bfs,每个节点vi向邻居节点发送的消息是自己的属性ci,每个节点vi从邻居节点vu收到的属性cu;
s14.从根节点开始,依次判断节点vi的属性ci是否不大于从邻居节点收到的最小属性mincu,若是,用ci更新节点vi的子节点,否则,不更新;
s15.对社交网络平面图进行一次遍历,找出所有idi=ci的节点;
s16.对每个idi=ci的节点,以该节点为根节点,执行分布式广度优先搜索,得到该节点对应的连通子图。
具体地,步骤s2具体包括以下步骤:
s20.对每个连通子图,进行步骤s21~s22,找出每个连通子图的分割层;
s21.构建连通子图的广度优先搜索树,统计每层li包含的节点总数l(li);
s22.根据每层li包含的节点总数l(li),找到连通子图里的分割层llow和lhigh。
具体地,步骤s22具体包括以下步骤:
s221.从根节点出发,向叶子节点递进,依次计算出从根节点到层li的总节点数sumi,直至满足
s222.从层lmedium出发,分别向根节点和叶子节点递进,直到分别找到分割层llow和lhigh,其满足条件分别是
具体地,步骤s3具体包括以下步骤:
s30.对每个连通子图,进行步骤s31~s37,寻找该连通子图分割层内的分离集;
s31.删除该连通子图对应的原始广度优先搜索树中层号小于llow及层号大于lhigh的所有节点,并新增一个节点r0,作为新广度优先搜索树的根节点,构建新图g′;
s32.从新图g′中任意选择一条非树边,分别找到所述非树边的两个端节点vi、wi到根节点r0的路径a和b,将路径a、路径b和边ab定义为环c;
s33.根据平面嵌入的结果,得到新图中每个节点的与其直接相连的所有的边的位置,所述的边的位置按顺时针顺序排列;
s34.根据各个节点及其边的时钟顺序,环c把图g′分割成两部分,节点数多的点集为inside,节点数少的点集为outside;
s35.从所述非树边的端节点vi、wi出发,向根节点r0递进,判断边(vi,y)和(wi,y)是否至少一个是树边,y为vi和wi的中间节点,若是,进入步骤s36,否则,进入步骤s37;
s36.从节点vi、wi到根节点r0的路径上继续遍历,交替移动vi和wi,每次移动一个节点,每次移动之后逐个检查当前vi节点、当前wi节点和y所构成的新环c′的inside的点数costinside,判断costinside是否小于2n/3,若是,停止移动,当前vi到根节点的路径、当前wi到根节点的路径和当前vi与wi对应的边构成新环c′,环c′为该连通子图的分离集;否则,继续移动;
s37.对两边的costinside同时进行判断,如果任一边costinside小于2n/3,环c为该连通子图的分离集;如果都大于2n/3,从节点vi、wi到根节点r0的路径上继续遍历,交替移动vi和wi,每次移动一个节点,每次移动之后逐个检查当前vi节点、当前wi节点和y所构成的新环c′的inside的点数costinside,判断costinside是否小于2n/3,若是,停止移动,当前vi到根节点的路径、当前wi到根节点的路径和当前vi与wi对应的边构成新环c′,环c′为该连通子图的分离集;否则,继续移动;其中,n为社交网络平面图的总节点数。
具体地,步骤s4具体包括以下步骤:
s41.对各自分离集节点为根节点构建的bfs树进行分层划分,按层对每一层进行编号,令层号为偶数的点构成集合a,令层号为奇数的点构成集合b;
s42.在集合a、b中利用shortcuts解决在子图g′中直径可能会大于原社交网络平面图直径的问题,得到直径缩小的子图g1;
s43.从子图g1并行计算每个节点的最短环路长度。
具体地,步骤s43具体包括以下步骤:
s431.以子图g1为对象,执行步骤s1~s3,得到子图g1的分离集xi;
s432.对分离集xi中的每个节点ri,计算每个节点ni与根节点ri的距离di,根据两个非树边端节点的距离di和dj可以得到对应的环c的长度,dc=di+dj+1;
s433.对于每个节点ri,分布式汇聚得到以其为根节点的所有环ci的长度,比较得到环ci最小长度dc_min。
具体地,汇聚最小长度环中所有节点的数值标号idi,即可得到该环由哪些节点组成的,对应到社交网络中,即最小社区包括哪些人。
第二方面,本发明实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述第一方面所述的最小社区发现方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:
本发明将社交网络抽象为社交网络平面图,通过亚线性时间分布式计算围长的方法,在分布式环境下得到图的所有连通子图、图中分割层和分离集,以分离集为基础,分布式计算图的最短环路长度,借助分布式计算和平面图的规则、特性,达到了亚线性时间复杂度,大大降低集中式求解平面图围长的时间复杂度,从而实现了快速而正确地发现社交网络中的最小社区;每条边在每一轮中最多传递一个消息,能够有效地避免节点发送消息过多而产生的拥塞。
附图说明
图1为本发明实施例提供的一种亚线性时间分布式计算围长的最小社区发现方法流程图;
图2为本发明实施例提供的消息传输中的平面图结构示意图;
图3为本发明实施例提供的步骤s5的图结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
首先,对本发明涉及的一些术语作出解释。
平面图:如果无向图g=<v,e>的所有节点和边可以在一个平面上图示出来,而使各边仅在节点处相交,称其为平面图。而非平面图不论怎样改画,除去节点外,总有边相交。
连通图:在无向图g中,从节点v到节点v′有路径,则称v和v′是连通的。若图中任意两节点v、v'∈v,v和v'之间均连通,则称g是连通图。
平面嵌入(planarembedding):若图g同构于平面图p,则称p是图g的一个平面嵌入。
环:环是一个边的排列,并且满足沿着这个排列走一次可以回到起点。
围长:一个图的围长定义为这个图所包含的最短环长。若这个图是无环图,它的围长则定义做无穷大。举例来说,4-环(正方形)的围长是4。
bfs:广度优先搜索,随机选取一个节点作为根节点;根节点向其邻居节点发送消息;没有接收过消息的节点,从发送消息给它的节点中随机选取一个,作为它的父亲节点,再向其邻居节点发送消息;接收到消息的节点之前已接收过消息,则不向其邻居节点发送消息;重复上述步骤,直到图中每个节点都接收到过消息,有父节点。即广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2...的节点。
非树边:对于固定的一个生成树,原图中任何不是生成树的边都叫非树边。
如图1所示,一种亚线性时间分布式计算围长的最小社区发现方法,该方法包括以下步骤:
步骤s0.将社交网络抽象为社交网络平面图;
步骤s1.找出社交网络平面图里所有连通子图;
步骤s2.根据所有连通子图信息,找出每个连通子图的分割层;
步骤s3.对于每个连通子图,从分割层出发逐层递进,寻找该连通子图分割层内的分离集;
步骤s4.根据找到的分离集,以该集合中的每个节点为根节点,构建对应的bfs树,并行计算每个节点的最短环路长度;
步骤s5.汇聚分离集中的所有点的最短环路长度,平面图的围长为其中最小值,拥有最小长度的环即为最小社区。
步骤s0.将社交网络抽象为社交网络平面图。
将社交网络抽象为社交网络平面图,节点为社交网络中的人,边为人与人之间的关系。
步骤s1.找出社交网络平面图里所有连通子图。具体地,包括以下步骤:
s11.对社交网络平面图进行一次遍历,按照遍历顺序给社交网络平面图中每个节点一个唯一数值标号idi,i=1,2,…,n,n为社交网络平面图的总节点数;
s12.初始化每个节点vi的属性ci为ci=idi;
s13.社交网络平面图中所有节点并行进行分布式bfs,每个节点vi向邻居节点发送的消息是自己的属性ci,每个节点vi从邻居节点vu收到的属性cu;
s14.从根节点开始,依次判断节点vi的属性ci是否不大于从邻居节点收到的最小属性mincu,若是,用ci更新节点vi的子节点,否则,不更新。
更新平面图中所有节点的ci值,经过此步骤,同一个连通子图中所有节点拥有相同的ci。此过程的运行时间等于整个图中拥有最小属性cmin的节点执行一遍分布式广度优先搜索的时间。
s15.对社交网络平面图进行一次遍历,找出所有idi=ci的节点;
s16.对每个idi=ci的节点,以该节点为根节点,执行分布式广度优先搜索,得到该节点对应的连通子图。
步骤s2.根据所有连通子图信息,找出每个连通子图的分割层。具体地,包括以下步骤:
s20.对每个连通子图,进行步骤s21~s22,找出每个连通子图的分割层。
s21.构建连通子图的广度优先搜索树,统计每层li包含的节点总数l(li)。具体为:从根节点出发,令根节点的层号lh=0,发送消息给它相邻节点;所有第一次接收消息的节点,随机从它的父亲节点中选择一个,层号等于父亲节点的层号加1,逐层传递消息,非第一次接收到消息的节点,层号不变,且不发送消息;重复此过程,直到图中所有节点均有层号li,统计每层li包含的节点总数l(li)。
如图2所示,令a节点为根节点,a的层号是lh=0。d节点接收到b、c节点的消息,选择b节点作为父亲节点,d节点的层号等于2。根节点a接收到b,c,d的层号lh和节点id,计算出第1层节点总数为2,第2层的节点总数为1。
s22.根据每层li包含的节点总数l(li),找到连通子图里的分割层llow和lhigh。
s221.从根节点出发,向叶子节点递进,依次计算出从根节点到层li的总节点数sumi,直至满足
s222.从层lmedium出发,分别向根节点和叶子节点递进,直到分别找到分割层llow和lhigh,其满足条件分别是
分离集必定位于分割层llow和lhigh之间的子图中。
步骤s3.对于每个连通子图,从分割层出发逐层递进,寻找该连通子图分割层内的分离集。
s30.对每个连通子图,进行步骤s31~s37,寻找该连通子图分割层内的分离集。
s31.删除该连通子图对应的原始广度优先搜索树中层号小于llow及层号大于lhigh的所有节点,并新增一个节点r0,作为新广度优先搜索树的根节点,构建新图g′。
s32.从新图g′中任意选择一条非树边,分别找到所述非树边的两个端节点vi、wi到根节点r0的路径a和b,将路径a、路径b和边ab定义为环c。
s33.根据平面嵌入的结果,得到新图中每个节点的与其直接相连的所有的边的位置,所述的边的位置按顺时针顺序排列。
新图g′是原始社交网络平面图的平面嵌入。平面图内所有节点与边的相对位置是固定的。
s34.根据各个节点及其边的时钟顺序,环c把图g′分割成两部分,节点数多的点集为inside,少的那一部分点集为outside。
s35.从所述非树边的端节点vi、wi出发,向根节点r0递进,判断边(vi,y)和(wi,y)是否至少一个是树边,y为vi和wi的中间节点,若是,进入步骤s36,否则,进入步骤s37;
s36.从节点vi、wi到根节点r0的路径上继续遍历,交替移动vi和wi,每次移动一个节点,每次移动之后逐个检查当前vi节点、当前wi节点和y所构成的新环c′的inside的点数costinside,判断costinside是否小于2n/3,若是,停止移动,当前vi到根节点的路径、当前wi到根节点的路径和当前vi与wi对应的边构成新环c′,环c′为该连通子图的分离集;否则,继续移动。
s37.对两边的costinside同时进行判断,如果任一边costinside小于2n/3,环c为该连通子图的分离集;如果都大于2n/3,从节点vi、wi到根节点r0的路径上继续遍历,交替移动vi和wi,每次移动一个节点,每次移动之后逐个检查当前vi节点、当前wi节点和y所构成的新环c′的inside的点数costinside,判断costinside是否小于2n/3,若是,停止移动,当前vi到根节点的路径、当前wi到根节点的路径和当前vi与wi对应的边构成新环c′,环c′为该连通子图的分离集;否则,继续移动。
步骤s4.根据找到的分离集,以该集合中的每个节点为根节点,构建对应的bfs树,并行计算每个节点的最短环路长度。
s41.对各自分离集节点为根节点构建的bfs树进行分层划分,按层对每一层进行编号,令层号li=0,2,4,6,…的点构成集合a,令层号li=1,3,5,7,…的点构成集合b。
该步骤是为了shortcuts做准备工作。
s42.利用shortcuts解决在子图中直径可能会大于原社交网络平面图直径的问题,得到直径缩小的子图g1。
shortcuts是指在图中添加额外的边,使得子图的直径减小,同时限定添加的边数,可以解决上述问题。目前已经在mst,min-cut上取得了很好地效果。采用这个方法,可以提升计算围长的分布式算法性能。
s43.从子图g1并行计算每个节点的最短环路长度。具体如下:
s431.以子图g1为对象,执行步骤s1~s3,得到子图g1的分离集xi;
s432.对分离集xi中的每个节点ri,计算每个节点ni与根节点ri的距离di,根据两个非树边端节点的距离di和dj可以得到对应的环c的长度,dc=di+dj+1;
s433.对于每个节点ri,分布式汇聚得到以其为根节点的所有环ci的长度,比较得到环ci最小长度dc_min。
步骤s5.汇聚分离集中的所有点的最短环路长度,平面图的围长为其中最小值,拥有最小长度的环即为最小社区。
所有连通子图的围长中的最小值就是平面图的围长。拥有最小长度的环即为最小社区,最小社区的大小=围长+1。汇聚最小长度环中所有节点的数值标号idi,即可得到该环由哪些节点组成的,对应到社交网络中,即最小社区包括哪些人。
如图3所示,节点d从其父亲节点中随机选择一个,不失一般性,选择b作为父亲节点,向b发送消息,节点d的dc_min=4,这样逐层递进,最后根节点汇聚所有节点的dc_min(节点e的dc_min=3),然后比较得出其中的最小值3,该值即为平面图的围长。
对平面图进行预处理,根据separatortheorem(分离集定理),设计低复杂度分布式算法,找出平面图中的分离集,此步骤的时间复杂度是o(d·min{logn,d}),d为原始图的直径;根据找到的分离集,分别从该集合中的每一个点出发,并行执行算法,找到该点对应的最短环路的长度,最后由分离集中的最短环路长度得到整个图的围长,此步骤的时间复杂度为o(dlog2n)。本发明旨在平面图上设计一个亚线性时间的分布式计算围长的方法,此方法的时间复杂度为o(dlog2n),保证了在大规模平面图中可以快速的分布式计算围长。
以上,仅为本申请较佳的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应该以权利要求的保护范围为准。