一种图算法友善的强连通图划分方法与流程

文档序号:11286468阅读:510来源:国知局
一种图算法友善的强连通图划分方法与流程

本发明涉及大数据处理技术领域,更具体地,涉及一种图算法友善的强连通图划分方法。



背景技术:

随着大数据时代的来临,图数据的规模快速增长并迅速超过了普通计算机的内存容量,为了对大规模图数据进行处理,研究人员提出了许多图划分方法将大规模图数据首先划分成若干个子图,使得每个子图能够装进内存,然后再依次将每个子图从磁盘载入内存并在其上运行图算法(这种处理方式称为核外图处理方式)。在此背景下,如何划分子图使得在核外环境下图算法能够在图数据上高效运行,是一个亟待解决的问题。

现有的图划分方法有很多,比如hash划分方法和基于多层图粗化的metis划分方法等。hash划分方法根据需要划分的子图数目,按照对每个顶点编号取模的结果将其分配到相应的子图中,这种方法可使得子图大小均衡(即每个子图中顶点的数量相同),但完全忽略了顶点之间存在的相邻关系和图算法的具体特点(比如同一个顶点在某些图算法执行过程中状态变化频繁,而在其他图算法执行中状态变化很少)。

metis划分方法包括粗化、划分、细化三个阶段。在粗化阶段,采用启发函数通过多轮粗化将多个顶点融合成一个顶点,使得图规模迅速减小并将缩小后的图作为第二阶段的输入。在划分阶段,采用经典划分方法(比如kernighan-lin方法)将粗化后的图进一步划分成多个子图。在细化阶段,根据第二阶段的划分结果,将粗化图中的顶点逐步还原为原始图中的顶点。metis针对无向图往往能取得较好的效果(比如子图之间的割边数目较小、各个子图的大小比较均衡),但缺点也很明显:(1)在划分之前需要将图数据完全载入内存并在运行过程中占用大量内存,当现实世界图规模越来越大时,这种方式对于有限的内存容量来说是不可接受的;(2)对有向图进行划分之前,需要将其转换成无向图,这导致有向图中边的方向信息丢失。

还有一些划分方法采用宽度优先搜索来划分子图,但这些划分方法通常从图数据中随机选取顶点作为宽度优先搜索的起始点,而且最后仅仅根据搜索树大小来组装子图,这种方法忽视了图算法的具体特点和图结构的关系,造成图算法和图划分方法不适应并使得后续图算法在子图上运行时遇到消息传播缓慢、顶点状态变化频繁等问题。

总体而言,现有的图划分方法存在以下不足:(1)对有向图划分时没有考虑边的方向信息;(2)划分时没有考虑现实世界图中巨型强连通分量的存在对图算法性能的影响;(3)划分时没有考虑不同类型的图算法所具有不同特点对图数据中顶点状态变化的影响。

弱连通分量是指无向图中的一个子图(即顶点和边的集合),该子图中任意一个顶点都可通过无向边组成的路径到达子图中的其他顶点。有向图可通过忽略边的方向来找对应的弱连通分量。常用的弱连通分量寻找算法是基于最小标签传播实现的,即每个顶点将自己的标签发送给相邻顶点,并从收到的标签中选择最小的作为自己的标签,算法多次运行直到图数据中所有顶点的标签不再变化为止。

强连通图(即强连通分量)是指有向图中的一个子图,该子图中任意一个顶点都可以通过有向边组成的路径到达其他顶点。在现实世界的图数据(简称为现实世界图)中往往存在很多的强连通分量,这些强连通分量中常有一个巨型的强连通分量,对于社交网络图而言,该巨型强连通分量的大小往往占整个图数据规模的80%左右,剩下的绝大部分都是小型强连通分量。由强连通分量的定义可知任意两个强连通分量之间边的方向都是单向的。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种图算法友善的强连通图划分方法,解决在限定条件下如何将大型强连通图划分为多个大小均匀、连通度好的子图的问题。

为实现上述目的,按照本发明的一个方面,提供了一种图算法友善的强连通图划分方法,包括如下步骤:

(1)将图数据划分成多个强连通分量的集合并将这些集合依次加入到第一队列queueset中;

(2)取出第一队列queueset中的第一个集合;

(3)判断该集合的大小是否小于给定的内存容量参数mc,如果是则进入步骤(4),否则进入步骤(5);

(4)将该集合组装成一个子图;

(5)用多源宽度优先搜索算法将该集合中部分顶点划分成多个搜索树,用弱连通分量算法将未被访问的顶点分解成多个弱连通分量,并将集合中的搜索树组装成多个子图;

(6)判断第一队列queueset是否为空,若是则结束,否则进入步骤(2)。

优选地,上述的强连通图划分方法,其步骤(5)包括如下子步骤:

(5.1)从集合的图数据中选取入度最大的numroot个顶点作为根结点并从这些根结点同时开始进行宽度优先搜索,每次宽度优先搜索形成一个由顶点和边组成的搜索树,由所形成的搜索树构成一个搜索树集合;

(5.2)判断图数据中未被访问的顶点总数是否小于给定阈值numactive,如果是则进入步骤(5.3),否则进入步骤(5.1);

(5.3)采用弱连通分量寻找算法将所有未被访问顶点划分成多个弱连通分量并加入到搜索树集合中;

本步骤中的弱连通分量是顶点和边的集合,集合中顶点通过忽略边的方向互相可达;

弱连通分量寻找算法可采用基于最小标签传播的算法来实现,该算法首先将图数据中每个顶点的编号作为该顶点对应的标签初始值;然后由每个顶点将自己的标签发送给相邻顶点,并从收到的标签中选择最小的作为自己的标签;多次运行上述步骤直到图数据中所有顶点的标签不再变化为止,由此拥有相同标签的顶点就属于同一个弱连通分量;

(5.4)选择k个最大的搜索树作为k个子图的起始搜索树,并将这k个搜索树标记为已访问;其中,k根据给定的内存容量参数mc与搜索树集合的大小来确定;

(5.5)在k个子图中选择最小的一个子图作为活跃子图;

(5.6)从所有未被访问的搜索树中选择一颗与活跃子图连通度最大的搜索树作为第一搜索树treehigh;

(5.7)在不超过内存容量参数mc的前提下,判断上述搜索树treehigh是否存在,若是则进入步骤(5.9),否则进入步骤(5.8);

(5.8)增加一个新子图以及该子图对应的集合,选择一个最大的未被访问的搜索树加入到新子图中,将该搜索树标记为已访问,令k=k+1,进入步骤(5.10);

(5.9)将搜索树treehigh标记为已访问并将其加入到活跃子图中,并进入步骤(5.10);

(5.10)判断搜索树集合中是否存在未被访问的搜索树,如果是则进入步骤(5.5),否则结束。

优选地,上述的强连通图划分方法,其步骤(5.1)包括如下子步骤:

(5.1.1)初始化图数据;

(5.1.2)选择入度最大的numroot个未被访问顶点作为numroot个对应宽度优先搜索的起始点,其中,numroot是由用户指定的参数;

(5.1.3)同时从上述numroot个顶点开始进行宽度优先搜索,每次宽度优先搜索将遍历过程中遇到的顶点和边加入到对应的搜索树中并将该搜索树中的顶点标记为已访问,每次宽度优先搜索最多运行l次;当上述numroot个宽度优先搜索遍历均停止之后,将这numroot次宽度优先搜索形成的搜索树依次加入到搜索树集合settree中;其中,l是用户指定的参数,使得形成的搜索树的最大规模不超过内存容量参数mc。

优选地,上述的强连通图划分方法,其步骤(5.2)中,判断所述图数据中未被访问的顶点总数是否小于给定阈值numactive,若是则进入步骤(5.3),否则进入步骤(5.1.2);其中,阈值numactive是由用户根据图数据中顶点总数所指定的参数。

优选地,上述的强连通图划分方法,其步骤(5.3)包括如下子步骤:

(5.3.1)初始化图数据中未被访问的顶点;

(5.3.2)在上述未被访问的顶点上采用弱连通分量寻找算法,将这些顶点和相关的边分解成若干个弱连通分量,并将这些弱连通分量依次加入到搜索树集合settree中;其中,每个弱连通分量与搜索树一样也是顶点和边的集合。

优选地,上述的强连通图划分方法,其步骤(5.4)包括如下子步骤:

(5.4.1)根据给定的内存容量参数mc与搜索树集合的大小,计算图数据拟划分成子图的数目

其中,settree表示搜索树集合;size(settree)表示搜索树集合settree中所有搜索树大小之和,用k个集合记录对应的k个子图所包含的搜索树;

(5.4.2)将搜索树集合settree中的所有搜索树按照大小从大到小排列;

(5.4.3)构造一个长度为n的一维数组state[n];其中,n表示集合settree中的搜索树个数,state[i]表示搜索树i的是否被访问,开始时均初始化为未访问;

(5.4.4)从搜索树集合settree中选择k个最大的搜索树分别加入到k个子图对应的集合中,并将这k个搜索树对应的state数组单元标记为已访问。

优选地,上述的强连通图划分方法,其步骤(5.5)中从k个子图中选择大小最小的子图pmin作为活跃子图。

优选地,上述的强连通图划分方法,其步骤(5.6)中,遍历搜索树集合settree中每个未被访问的搜索树treetmp,若size(treetmp)+size(pmin)≤mc,则计算获取未被访问的搜索树treetmp与活跃子图pmin之间的边数目edgesc,并计算获取未被访问的搜索树treetmp与其他搜索树相连的所有边的数目edgeso;将遍历过程中连通度最大的那颗搜索树作为第一搜索树treehigh;

其中,未被访问的搜索树treetmp与活跃子图pmin之间的连通度为size(treetmp)是指搜索树treetmp,size(pmin)是指活跃子图pmin的大小。

优选地,上述的强连通图划分方法,其步骤(5.7)中,在搜索树treetmp的大小与活跃子图pmin的大小之和不超过内存容量mc的前提下,判断第一搜索树treehigh是否存在,若是则进入步骤(5.8);若否,则进入步骤(5.9);其中,当每个treetmp的大小加上活跃子图pmin的大小后均超过内存容量mc是,则判定为第一搜索树不存在。

优选地,上述的强连通图划分方法,其步骤(5.8)中,将第一搜索树treehigh加入到活跃子图pmin对应的集合中,活跃子图pmin大小相应增加并将第一搜索树treehigh在状态数组state中的对应单元标记为已访问,并进入步骤(5.10)。

优选地,上述的强连通图划分方法,其步骤(5.9)中,增加并初始化一个新的子图和一个新集合用以存放新子图中的搜索树,并从搜索树集合settree未被访问的搜索树中选择一棵最大的搜索树来初始化这个新子图,将该搜索树标记为已访问,令k=k+1,进入步骤(5.10)。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:

(1)本发明提供的图算法友善的强连通图划分方法,考虑了现实世界图的结构和边的方向,将图初步划分成多个集合,使得任意两个集合之间的边都是单向的,再对每个集合分别处理,这避免了后续图算法运行过程中对每个子图进行频繁的处理,从而提高了图算法的性能;

(2本发明提供的图算法友善的强连通图划分方法,其步骤(5)中,通过步骤(5.1)将图数据划分成顶点相互连通的搜索树,通过步骤(5.6)将连接紧密的搜索树组装成子图使得子图中的大部分顶点互相连通(即子图内部具有较好的连通性)使得对该子图进行处理时顶点产生的新消息能顺利传播到相邻顶点从而使图算法具有较高的效率;通过步骤(5.5)中每次选择最小的子图进行组装使得最终组装的子图大小相对均匀;

(3)本发明提供的图算法友善的强连通图划分方法,其步骤(5.1)中每次选取入度最大的顶点作为宽度优先搜索的起始点,使得在图算法运行过程中状态频繁变化的顶点和其大部分相邻顶点位于同一个子图中,考虑了图算法的具体特点与图数据中顶点存在的关系,使得划分方法与图算法相适应,最终使得图算法能够对子图进行高效处理。

附图说明

图1为实施例提供的一种图算法友善的强连通图划分方法的总体框架图;

图2为实施例提供的一种图算法友善的强连通图划分方法的总体流程图;

图3为实施例提供的一种图算法友善的强连通图划分方法的步骤1的结果示意图;

图4为实施例提供的一种图算法友善的强连通图划分方法的步骤5的流程示意图;

图5为实施例提供的一种图算法友善的强连通图划分方法步骤5利用启发式算法将搜索树组装成子图的过程示意图;

图6为实施例提供的一种图算法友善的强连通图划分方法步骤5利用启发式算法将搜索树组装成子图的结果示意图。

具体实施方式

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

图1所示为本发明实施例提供的一种图算法友善的强连通图划分方法的总体框架图,顶层是该划分方法的三个阶段:第一阶段,将图数据分解成三个集合;第二阶段,利用多源宽度优先搜索算法将大小超过给定阈值的集合进一步划分成多个搜索树;第三阶段,利用启发式算法将搜索树组装成多个子图;中间层负责图数据的i/o;最底层是操作系统和硬件。

图2所示为本发明一种图算法友善的强连通图划分方法的流程图,具体包括以下步骤:

(1)将图数据划分成多个强连通分量的集合并将这些集合依次加入到第一队列queueset中,具体包括一下子步骤;

(1-1)将输入的图数据初始化;

(1-2)利用现有的强连通分量寻找算法找出输入图中所有强连通分量;

(1-3)找出大小最大的强连通分量;

(1-4)对于剩下的强连通分量,若其有边直接指向巨型强连通分量或者能通过其他强连通分量间接指向巨型强连通分量则将其加入到左强连通分量集合(简称左集合)中,否则将其加入到右强连通分量集合(简称右集合)中;

(1-5)将左集合、巨型强连通分量和右集合依次加入到队列queueset中。图3所示,是本实施例中步骤1的处理结果,通过将强连通分量按照其与巨型强连通分量的关系分别将其放入左强连通分量集合(左集合)和右强连通分量集合(右集合)中;其中两个虚线围成的区域即表示两个集合,中间的部分表示巨型强连通分量。

(2)取出队列queueset头部的集合,记为sethead。

(3)判断集合sethead的大小是否小于给定的内存容量参数mc,如果是则进入步骤(4),否则进入步骤(5)。

(4)将集合sethead组装成一个子图。

(5)用多源宽度优先搜索算法将该集合中部分顶点划分成多个搜索树,用弱连通分量算法将未被访问的顶点分解成多个弱连通分量,并将集合中的搜索树组装成多个子图;其流程如图4所示,具体包括如下子步骤:

(5.1)从集合的图数据中选取入度最大的numroot个顶点作为根结点并从这些根结点同时开始进行宽度优先搜索,每次宽度优先搜索形成一个由顶点和边组成的搜索树,由所形成的搜索树构成一个搜索树集合;该步骤包括如下子步骤:

(5.1.1)将集合sethead中的顶点全部标记为未访问,并初始化搜索树集合settree用以存储宽度优先搜索过程中形成的搜索树;

(5.1.2)选择入度最大的numroot个未被访问顶点作为numroot个宽度优先搜索的源点,其中,numroot是由用户指定的参数;

(5.1.3)同时从这numroot个顶点开始执行宽度优先搜索,每次宽度优先搜索将遍历过程中遇到的顶点和边加入到对应的搜索树中并将该搜索树中的顶点标记为已访问,每次宽度优先搜索最多运行l次当这numroot次宽度优先搜索遍历均停止之后,将遍历过程中形成的numroot个宽度优先搜索树加入到搜索树集合settree中;其中,l是用户指定的参数,确保形成的搜索树最大不超过给定内存容量mc;

(5.2)判断集合sethead中未被访问的顶点总数是否小于给定阈值numactive,如果是则进入步骤(5.3),否则进入步骤(5.1);阈值numactive是由用户指定的参数,实施例中设为sethead中顶点总数的10%;

(5.3)采用弱连通分量寻找算法将集合sethead中所有未被访问顶点划分成多个弱连通分量并加入到搜索树集合中;具体包括如下子步骤:

(5.3.1)初始化集合sethead中所有未被访问的顶点;

(5.3.2)在这些未被访问的顶点上运行弱连通分量算法,将这些顶点分成若干个弱连通分量并将这些弱连通分量依次加入到搜索树集合settree中。

(5.4)选择k个最大的搜索树作为k个子图的起始搜索树,并将这k个搜索树标记为已访问;其中,k根据给定的内存容量参数mc与搜索树集合的大小来确定;具体包括如下子步骤;

(5.4.1)根据给定的内存容量参数mc与搜索树集合settree的大小,计算图数据拟划分成子图的数目

其中,settree表示搜索树集合;size(settree)表示搜索树集合settree中所有搜索树大小之和,用k个集合记录对应的k个子图所包含的搜索树;

(5.4.2)将搜索树集合settree中的所有搜索树按照大小从大到小排列;

(5.4.3)构造一个长度为n的一维数组state[n];其中,n表示集合settree中的搜索树个数,state[i]表示搜索树i的是否被访问,开始时均初始化为未访问;

(5.4.4)从搜索树集合settree中选择k个最大的搜索树分别加入到k个子图对应的集合中,并将这k个搜索树对应的state数组单元标记为已访问。

(5.5)在k个子图中选择最小的一个子图作为活跃子图;

(5.6)遍历搜索树集合settree中每个未被访问的搜索树treetmp,若size(treetmp)+size(pmin)≤mc,则计算获取未被访问的搜索树treetmp与活跃子图pmin之间的边数目edgesc,并计算获取未被访问的搜索树treetmp与其他搜索树相连的所有边的数目edgeso;将遍历过程中连通度最大的那颗搜索树作为第一搜索树treehigh;

其中,未被访问的搜索树treetmp与活跃子图pmin之间的连通度为size(treetmp)是指搜索树treetmp,size(pmin)是指活跃子图pmin的大小。

从所有未被访问的搜索树中选择一颗与活跃子图连通度最大的搜索树作为第一搜索树treehigh;

(5.7)在不超过内存容量参数mc的前提下,判断上述搜索树treehigh是否存在,若是则进入步骤(5.9),否则进入步骤(5.8);

(5.8)增增加并初始化一个新子图和一个新集合用以存放新子图中的搜索树,并从集合settree未被访问的搜索树中选择一个最大的搜索树来初始化这个新子图,将该搜索树在状态数组state中对应位置标记为已访问,令k=k+1,进入步骤(5.10);

(5.9)将搜索树treehigh在状态数组state中的对应单元标记为已访问并将其加入到活跃子图pmin对应的集合中,并进入步骤(5.10);

(5.10)判断状态数组state中是否存在未被访问的搜索树,如果是则进入步骤(5.5),否则将这k个集合中的顶点分配至对应的子图中。

(6)判断队列queueset是否为空,如果不为空则进入步骤(2),否则结束。

图5示意了本实施例中搜索树的组装过程,在实施例的本过程中,预设组装过程中没有子图大小超过内存容量参数mc;该图中有六棵搜索树(tree1~tree6),每棵搜索树上的权值表示该搜索树的大小,搜索树之间的边上的权值表示同方向的边的数目,假设算法要将这些搜索树组装成2个子图。算法首先选择两棵大小最大的搜索树即tree1和tree6来初始化两个子图partition1和partition2,接下来算法选择最小的子图即partition1作为活跃子图并从相邻的搜索树中选择一个搜索树来吸收;图5中,未被访问的的搜索树有tree4、tree5、tree2和tree3,计算每个未被访问的搜索树与活跃子图间的连通度,通过计算可得tree4的连通度为tree5为0.58,tree2为0.33,tree3为0.0,活跃子图partition1选择吸收连通度最大的搜索树tree4并将大小相应的增加,tree4被标记为已访问;通过重复这个过程直到图3中所有的搜索树均已被搜索树吸收,如图6所示,最终partition1中包含了tree1、tree4和tree5,partition2中包含了tree6、tree2和tree3。

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

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