一种动态超图的中介中心性度量的快速维护方法

文档序号:32401866发布日期:2022-12-02 19:16阅读:41来源:国知局
一种动态超图的中介中心性度量的快速维护方法

1.本技术属于数据挖掘技术领域,特别涉及一种动态超图的中介中心性度量的快速维护方法。


背景技术:

2.图,作为一种结构化数据,常被用于多领域的数据建模。但图结构的局限性在于其只能建模对象之间的二元关联关系,但现实世界中对象之间的关系往往是复杂的一对多或多对多的多元关系,所以用图来建模数据会丢失一些重要信息。超图,作为图这种结构化数据的泛化,其超边可以包含任意数目的顶点,所以相比于图,超图可以更加准确、全面的建模存在多元关联的对象之间的关系。近年来,超图已被广泛应用于社交网络、生物网络、通讯网络等等越来越多的领域。
3.中心性是图分析领域的重要指标,用于判断网络中节点的影响力。其中,中介中心性被用于查找网络中的控制点,一个顶点的中介中心性越高,说明越多的顶点之间的最短路径都需要通过该顶点中转,顶点的消失会导致其他顶点之间的交流变得困难。中介中心性在现实中也有广泛的应用,如寻找社交网络中信息传播的关键节点、寻找不同领域间的跨界者等等。
4.由于现实中的网络经常发生边的插入与删除,所以快速的在动态超图中维护节点的中介中心性至关重要。现有的算法多数是在静态超图中计算顶点的中介中心性,但直接使用静态算法维护动态超图的中介中心性时,算法会重新对每个点执行正向宽搜计算顶点在新超图中的levels集合、到其他顶点与超边的最短路径数,以及执行反向累积计算该顶点对其他顶点的源依赖,在算法执行过程中会存在大量冗余计算。


技术实现要素:

5.为了实现动态超图中介中心性的快速维护,本发明提出了一种用于快速维护动态超图中介中心性的算法,对超图中不同类别的顶点使用不同的更新策略,避免了大量的冗余计算,相比于静态算法能够更快的在超边插入或删除时维护超图顶点的中介中心性。其技术方案为,
6.一种动态超图的中介中心性度量的快速维护方法,包括以下步骤,
7.s1.一个初始的超图h=(v,e),v为顶点集合,e为超边集合,顶点数为n,超边数为m;初始化辅助数组record和一维数组bc,辅助数组record保存最初的静态超图上的中间计算结果,包括三维数组record_levels、二维数组record_npv、二维数组record_npe、二维数组record_dpv,其中三维数组record_levels保存以每个顶点为源点在超图中产生的宽搜结果;二维数组record_npv保存任意顶点vk(k=1...n)到其他顶点的最短路径数;二维数组record_npe保存任意顶点vk(k=1...n)到其他超边的最短路径数;二维数组record_dpv保存任意顶点vk(k=1...n)对其他顶点的源依赖;一维数组bc保存顶点vk(k=1...n)的中介中心性值;
8.s2.在超图h上插入或删除超边e0,e0包含的顶点集为v
e0

9.s3.遍历超边e0中的每个顶点,根据辅助数组record中记录的宽搜结果,得到在更新前的超图中e0到其他顶点的距离信息;
10.s4.根据距离信息,得到超图中的顶点vk(k=1...n)的类别;
11.s5.根据顶点的类别在超图上执行相应的正向更新策略,并将辅助数组record_levels、record_npv、record_npe中的信息更新为在新超图中的正向更新结果;
12.s6.判断顶点是否是源依赖受影响的顶点,若是,则执行反向累积计算该顶点的新源依赖,并将新的源依赖增量累加到bc数组中,并将辅助数组record_dpv中的信息更新为新源依赖;若不是,则跳至s7;
13.s7.若k==n,则本次超图更新结束;否则,令k=k+1,跳至步骤s4;
14.s8.若继续插入、删除超边,跳至s2;否则,算法结束。
15.优选的,由于在超图中以顶点vk为源点进行宽搜可以不断交替得到顶点与超边集合,其中顶点集合称为顶点边界frontierv,超边集合称为超边边界frontiere,得到的所有顶点与超边边界的集合称为顶点vk的levels集合;所以根据顶点vk与顶点集所在连通分量的情况,以及中的顶点在顶点vk的levels集合中所处的位置,当超边插入时,将顶点vk分为不受影响的a1类顶点、受影响的a2类顶点、受影响的a3类顶点、不受影响的a4类顶点、受影响的a5类顶点;当超边删除时,将顶点vk分为不受影响的d1类顶点、受影响的d2类顶点和不受影响的d3类顶点。
16.优选的,当插入超边时,若顶点vk与顶点集中的全部顶点属于同一个连通分量,
17.当中的所有顶点都位于vk的levels集合的同一个顶点边界frontierv[t]中时,在更新前的超图中,中的所有顶点到vk的距离相等,此时,称vk为不受影响的a1类顶点,对于不受影响的a1类顶点,仅在顶点边界frontierv[t]下方的超边边界frontiere[t+1]中加入e0即可;
[0018]
当中的所有顶点都位于vk的levels集合的上下相邻的两个顶点边界frontierv[t]与frontierv[t+2]中时,在更新前的超图中,中的所有顶点到vk的最大距离之差为1,此时,称vk为受影响的a2类顶点;对于受影响的a2类顶点,需要将e0加入到超边边界frontiere[t+1]中;并以e0为初始边界进行宽搜,寻找到受影响的顶点与超边,并在过程中增量更新这些顶点与超边的最短路径数;
[0019]
当中的顶点位于的离vk最近与最远的顶点边界分别为frontierv[t]与frontierv[t+p](p》2)时,超边e0的插入会影响vk的levels集合的整体结构,从而也会影响vk到其他顶点与超边的最短路径数,在更新前的超图中,中的所有顶点到vk的最大距离之差大于1,此时,称vk为受影响的a3类顶点;对于受影响的a3类顶点,需要将超边e0加入到顶点边界frontierv[t]的下一个超边边界frontiere[t+1]中,因只有超边边界frontiere[t+1]下方的levels集合的结构会发生变化,所以以frontiere[t+1]为初始边界进行部分宽搜,更新levels集合的整体结构和最短路径数。
[0020]
优选的,当插入超边e0时,若顶点vk与顶点集中的顶点都不属于同一个连通分量,此时超边e0的插入对顶点vk的宽搜结果不会有任何影响,所以不需要对vk的宽搜结果进
行更新,此时vk为不受影响的a4类顶点;
[0021]
当插入超边e0时,若顶点vk与顶点集中的部分顶点属于同一个连通分量,此时超边e0连通了vk所在的连通分量与其他顶点所在的连通分量,vk的levels集合的整体结构与到其他顶点和超边的最短路径数一定会受到影响,此时称vk为受影响的a5类顶点;对于a5类顶点,需要将超边e0加入到顶点边界frontierv[t]的下一个超边边界frontiere[t+1]中,顶点边界frontierv[t]为中的顶点所在的离vk最近的顶点边界。因只有超边边界frontiere[t+1]下方的levels集合的结构会发生变化,所以以frontiere[t+1]为初始边界进行部分宽搜,更新levels集合的整体结构和最短路径数。
[0022]
优选的,当删除超边e0时,若顶点vk与顶点集的全部顶点属于同一个连通分量,
[0023]
当中的所有顶点都位于vk的levels集合的同一个顶点边界frontierv[t]中时,超边e0的删除不会对vk的levels集合的整体结构产生影响,也不会影响vk到其他顶点的最短路径数;在更新前的超图中,中的所有顶点到vk的距离相等,此时称vk为不受影响的d1类顶点;
[0024]
当中的顶点不仅仅位于同一个顶点边界时,超边e0的删除会影响vk的levels集合的整体结构与最短路径数;在更新前的超图中,中的所有顶点到vk的距离之差大于0,此时称vk为受影响的d2类顶点。
[0025]
优选的,当删除超边e0时,若顶点vk与顶点集的顶点不属于同一个连通分量,此时超边e0的删除对顶点vk的宽搜结果不会有任何影响,所以不需要对vk的宽搜结果进行更新,此时称vk为不受影响的d3类顶点。
[0026]
优选的,步骤s2中,判断超边e0的更新类别,若是插入,跳至s2.1.1;若是删除,跳至s2.2.1;
[0027]
s2.1.1.为新插入的超边生成超边号edge_index为当前最大的超边号+1,并将超图的边数m加1;
[0028]
s2.1.2.将新插入的超边信息添加至超图中,跳至s3;
[0029]
s2.2.1.将超图的边数m减1;
[0030]
s2.2.2.将删除的超边信息从超图中删除。
[0031]
优选的,步骤s3中,通过以超边e0中的顶点为源点执行宽搜,得到距离信息,来判断顶点的类别,具体如下:
[0032]
s3.1.初始化一维数组max记录在更新前的超图中,顶点vk(k=1...n)到e0的最长距离,初始化为0;一维数组min记录在更新前的超图中,顶点vk(k=1...n)到e0的最短距离,初始化为max;
[0033]
s3.2.若更新状态为插入,初始化一维数组unreach记录在更新前的超图中,超边e0中是否有顶点vk(k=1...n)不可达的顶点,初始化为1,表示都可达;一维数组detae记录顶点vk(k=1...n)到超边e0的最短路径数,初始化为0;
[0034]
s3.3.遍历超边e0中的每个顶点p,通过辅助数组record中记录的顶点p的宽搜结果,维护超边插入数组(max、min、unreach、detae)或超边删除数组(max、min);
[0035]
s3.3.1.遍历辅助数组record中保存的顶点p的levels集合record_levels[p],得
到顶点p到任意顶点vk的距离curr_d,若大于max[k],则令max[k]=curr_d;若小于min[k],则令min[k]=curr_d;若更新状态为超边删除,直接跳至s3.3.5;
[0036]
s3.3.2.初始化一维数组reach_temp为0,表示顶点p到任意顶点vk(k=1...n)的可到达情况;
[0037]
s3.3.3.若curr_d小于min[k],则令detae[k]为record中保存的顶点p到顶点k的最短路径数record_npv[p][k];若curr_d等于min[k],则将detae[k]累加record_npv[p][k];对record_levels[p]中的每个顶点vk的reach_temp[k]置1表示顶点vk为顶点p可达的顶点;
[0038]
s3.3.4.将reach_temp[k]==0的顶点vk的unreach[k]置0,表示超边e0中存在顶点vk不可达的顶点;
[0039]
s3.3.5.若未遍历完,则令p为e0中下一个顶点,跳至s3.3.1。
[0040]
优选的,步骤s4中,取超图中的顶点vk,根据max、min、unreach数组中的值,判断顶点vk(k=1...n)类别;若更新状态是插入,跳至s4.1.1;若更新状态是删除,跳至s4.2;
[0041]
s4.1.1.若unreach[k]==0,跳至s4.1.2;若unreach[k]==1,跳至s4.1.3;
[0042]
s4.1.2.若max[k]==0且min[k]==max,则顶点vk为不受影响的a4类顶点;否则顶点vk为受影响的a5类顶点,跳至s4;
[0043]
s4.1.3.若max[k]==min[k],则顶点vk为不受影响的a1类顶点;若max[k]==min[k]+1,则顶点vk为受影响的a2类顶点;否则,顶点vk为受影响的a3类顶点,跳至s4;
[0044]
s4.2.若max[k]==0且min[k]==max,则顶点vk为不受影响的d3类顶点;若max[k]==min[k],则顶点vk为不受影响的d1类顶点;若max[k]》min[k],则顶点vk为受影响的d2类顶点。
[0045]
优选的,步骤s5中,根据顶点vk的类别执行对应的更新策略,具体如下,
[0046]
s5.1.根据min[k]的值可以得到更新的超边所在的超边边界fe在levels集合中的位置为2*min[k]+1;
[0047]
s5.2.初始化二维数组levels为辅助数组record中保存的以顶点vk为源点,在更新前的超图中的宽搜结果record_levels[k];一维数组npv=record_npv[k];一维数组npe=record_npe[k];一维数组dpv=record_dpv[k];
[0048]
s5.3.若为不受影响的a1类顶点,跳至s5.4;若为受影响的a2类顶点,跳至s5.5;若为受影响的a3类顶点,跳至s5.6;若为不受影响的a4类顶点,跳至s5.7;若为受影响的a5类顶点,跳至s5.8;若为不受影响的d1类顶点,跳至s5.9;若为受影响的d2类顶点,跳至s5.10;若为不受影响的d3类顶点,跳至s6;
[0049]
s5.4.不受影响的a1类顶点的正向更新
[0050]
s5.4.1.在顶点vk的levels[2*min[k]+1]出插入新的超边;
[0051]
s5.4.2.更新顶点vk的npe[edge_index]为顶点k到该超边的最短路径数;
[0052]
s5.4.2.更新record_levels、record_npe中的记录;
[0053]
s5.5.受影响的a2类顶点的正向更新
[0054]
s5.5.1.在顶点vk的levels[2*min[k]+1]出插入新的超边;
[0055]
s5.5.2.更新顶点vk的npe[edge_index]为顶点k到该超边的最短路径数;
[0056]
s5.5.3.以{e0}为初始超边边界开始正向宽搜,根据顶点与超边之间的祖先关系
依次找到与e0相关的顶点或超边,即顶点vk到这些顶点或超边的最短路径通过超边e0;在宽搜过程中同步增量更新vk到顶点或超边的最短路径数,某顶点最短路径数的增量,等于宽搜过程所涉及的该顶点的前置超边的最短路径数增量之和,超边的最短路基数增量同理;
[0057]
s5.5.4.更新record_levels、record_npv、record_npe中的记录;
[0058]
s5.6.受影响的a3类顶点和受影响的a5类顶点的正向更新
[0059]
s5.6.1.在顶点vk的levels[2*min[k]+1]出插入新的超边;
[0060]
s5.6.2.更新顶点vk的npe[edge_index]为顶点k到该超边的最短路径数;
[0061]
s5.6.3.将e0所在的超边边界之后的边界清空,即将levels[2*min[k]+1]之后的levels集合清除;
[0062]
s5.6.4.对于levels[2*min[k]+1]上方的边界所包含的元素之外的元素,将npv和npe中对应的最短路径数清零;
[0063]
s5.6.5.以{e0}所在的超边边界为初始边界,开始正向宽搜。在过程中将新的顶点与超边边界添加到levels集合中,同时在npv和npe中更新顶点或超边的最短路径数;
[0064]
s5.6.6.更新record_levels、record_npv、record_npe中的记录;
[0065]
s5.7.不受影响的a4类顶点的正向更新
[0066]
s5.7.1.在npe中加入vk到e0的最短路径数:npe[edge_index]=0;
[0067]
s5.7.2.更新record_npe中的记录;
[0068]
s5.8.不受影响的d1类顶点的正向更新
[0069]
s5.8.1.在levels[2*min[k]+1]中将e0删除;
[0070]
s5.8.2.将顶点vk的npe[edge_index]清零;
[0071]
s5.8.3.更新record_levels、record_npe中的记录;
[0072]
s5.9.受影响的d2类顶点的正向更新
[0073]
s5.9.1.在levels[2*min[k]+1]中将e0删除;
[0074]
s5.9.2.将顶点vk的npe[edge_index]清零;
[0075]
s5.9.3.将e0所在的超边边界之后的边界清空,即将levels[2*min[k]+1]之后的levels集合清除;
[0076]
s5.9.4.对于levels[2*min[k]+1]上方的边界所包含的元素之外的元素,将npv和npe中对应的最短路径数清零;
[0077]
s5.9.5.以{e0}所在的超边边界为初始边界,开始正向宽搜。在过程中将新的顶点与超边边界添加到levels集合中,同时在npv和npe中更新顶点或超边的最短路径数;
[0078]
s5.9.6.更新record_levels、record_npv、record_npe中的记录。
[0079]
优选的,对于受影响的a2类顶点、受影响的a3类顶点、受影响的a5类顶点、受影响的d2类顶点这四类源依赖受影响的顶点,反向累积计算新的源依赖,并更新超图中顶点的中介中心性,具体步骤如下,
[0080]
s6.1.若顶点为不受影响的a1类顶点、不受影响的a4类顶点、不受影响的d1类顶点、不受影响的d3类顶点,跳至s7,若不是执行s6.2;
[0081]
s6.2.初始化一维数组dpv,用于存储顶点vk对其他顶点的新源依赖;初始化一维数组dpv_old=record_dpv[k]为在更新前的超图中,顶点vk对其他顶点的旧源依赖;
[0082]
s6.3.执行反向累积计算顶点vk对其他顶点vq的新源依赖,dpv[q];
[0083]
s6.3.更新每个顶点vq的中介中心性,bc[q]-dpv_old[q]+dpv[q];
[0084]
s6.4.更新record_dpv[k]的记录。
[0085]
有益效果
[0086]
本发明提出了一个用于维护动态超图中介中心性的算法,它通过使用辅助数组存储中间计算结果、对顶点进行分类并采取不同的更新策略,来减少冗余计算,能够更快的计算出插入或删除超边后的超图的中介中心性。
附图说明
[0087]
图1为初始超图h。
[0088]
图2为在超图h中插入超边后得到的新超图。
[0089]
图3为效果图。
[0090]
图4为本申流程图。
具体实施方式
[0091]
以下详细说明都是例示性的,旨在对本技术提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本技术所属技术领域的普通技术人员通常理解的相同含义。需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本技术的示例性实施方式。
[0092]
本发明提出了一个用于维护动态超图中介中心性的算法。本发明主要分为二个部分,第一部分:动态超图中顶点类别的定义与对应的正向更新策略;第二部分:动态超图的中介中心性维护算法。
[0093]
第一部分:
[0094]
一个初始的超图h=(v,e),顶点数为n,超边数为m。在超图h上插入或删除超边e0,e0包含的顶点集为v
e0
。本发明对超图中的任意一顶点vk(k=1...n),根据超边更新后,顶点vk的宽搜结果所受的不同影响,将vk进行分类,并且对于超边的插入与删除,执行不同的分类标准。
[0095]
当超边插入时,根据顶点vk与顶点集v
e0
所在连通分量的情况,分三种情况讨论:
[0096]
情况一,顶点vk与顶点集中的全部顶点属于同一个连通分量。此时分三种类别讨论:
[0097]
类别1,当中的所有顶点都位于vk的levels集合的同一个顶点边界frontierv[t]中时,超边e0的插入不会对vk的levels集合的整体结构产生影响,也不会影响vk到其他顶点的最短路径数。能够发现,在更新前的超图中,中的所有顶点到vk的距离相等。此时,称vk为不受影响的a1类顶点。
[0098]
对于a1类顶点,仅在顶点边界frontierv[t]下方的超边边界frontiere[t+1]中加入e0即可。
[0099]
类别2,v
e0
中的所有顶点都位于vk的levels集合的上下相邻的两个顶点边界frontierv[t]与frontierv[t+2]中,超边e0的插入不会对vk的levels集合的整体结构产生影响,也但会影响vk到其他顶点与超边的最短路径数。能够发现,在更新前的超图中,中
的所有顶点到vk的最大距离之差为1。此时,称vk为受影响的a2类顶点。
[0100]
对于a2类顶点,首先需要将e0加入到超边边界frontiere[t+1]中。接下来,需要对部分顶点与超边的最短路径数进行更新。容易发现,有且仅有经e0可达的顶点与超边的最短路径数受影响,且最短路径数的增量为vk到e0的最短路径数npe[e0]的整数倍。所以以e0为初始边界进行宽搜,寻找到受影响的顶点与超边,并在过程中增量更新这些顶点与超边的最短路径数,此方式可以避免对其他不受影响的元素的最短路径数的查询。
[0101]
类别3,当中的顶点所在的边界不是上下相邻的,超边e0的插入会影响vk的levels集合的整体结构,从而也会影响vk到其他顶点与超边的最短路径数。能够发现,在更新前的超图中,中的所有顶点到vk的最大距离之差大于1。此时,称vk为受影响的a3类顶点。
[0102]
对于a3类顶点,首先需要将e0加入到超边边界frontiere[t+1]中(顶点边界frontierv[t]为中距vk最近的顶点所在的边界)。接下来,更新levels集合的整体结构和最短路径数。容易发现,只有超边边界frontiere[t+1]下方的levels集合的结构会发生变化,所以以frontiere[t+1]为初始边界进行部分宽搜。
[0103]
情况二,顶点vk与顶点集中的顶点都不属于同一个连通分量。此时超边e0的插入对顶点vk的宽搜结果不会有任何影响,所以不需要对vk的宽搜结果进行更新。此时称vk为不受影响的a4类顶点。
[0104]
情况三,顶点vk与顶点集中的部分顶点属于同一个连通分量。此时超边e0连通了vk所在的连通分量与其他顶点所在的连通分量。容易发现,vk的levels集合的整体结构与到其他顶点和超边的最短路径数一定会受到影响。此时称vk为受影响的a5类顶点。同a3类顶点,也使用部分宽搜策略进行更新。
[0105]
当超边删除时,根据顶点vk与顶点集所在连通分量的情况,分两种情况讨论:
[0106]
情况一,顶点vk与顶点集的全部顶点属于同一个连通分量。此时分两种类别讨论:
[0107]
类别1,当中的所有顶点都位于vk的levels集合的同一个顶点边界frontierv[t]中时,超边e0的删除不会对vk的levels集合的整体结构产生影响,也不会影响vk到其他顶点的最短路径数。能够发现,在更新前的超图中,中的所有顶点到vk的距离相等。此时称vk为不受影响的d1类顶点。
[0108]
类别2,当中的顶点不仅仅位于同一个顶点边界时,超边e0的删除很大可能会影响vk的levels集合的整体结构与最短路径数。能够发现,在更新前的超图中,中的所有顶点到vk的距离之差大于0。此时称vk为受影响的d2类顶点。
[0109]
情况二,顶点vk与顶点集的顶点不属于同一个连通分量。此时超边e0的删除对顶点vk的宽搜结果不会有任何影响,所以不需要对vk的宽搜结果进行更新。此时称vk为不受影响的d3类顶点。
[0110]
以上,是本发明对动态超图中顶点的分类与正向更新策略,当超边插入时,将顶点分为5类,其中2类为源依赖不受影响的顶点,3类为源依赖受影响的顶点;当超边删除时,将
顶点分为3类,其中2类为源依赖不受影响的顶点,1类为源依赖受影响的顶点。
[0111]
第二部分:
[0112]
如图4所示,本发明提供了一种用于维护动态超图中介中心性的算法,可以实现超边的连续插入、删除时的中介中心性维护。主要包括以下步骤:
[0113]
s1.一个初始的超图h=(v,e),v为顶点集合,e为超边集合,顶点数为n,超边数为m。全局变量辅助数组record,用于存储在当前超图上的中间计算结果。
[0114]
s2.在超图h上插入或删除超边e0,e0包含的顶点集为
[0115]
s3.遍历超边e0中的每个顶点,根据辅助数组record中记录的宽搜结果,得到在更新前的超图中e0到其他顶点的距离信息;
[0116]
s4.根据距离信息,得到超图中的顶点vk(k=1...n)的类别;
[0117]
s5.根据顶点的类别在超图上执行相应的正向更新策略,并将辅助数组record_levels、record_npv、record_npe中的信息更新为在新超图中的正向更新结果。;
[0118]
s6.判断顶点是否是源依赖受影响的顶点,若是,则执行反向累积计算该顶点的新源依赖,并将新的源依赖增量累加到bc数组中,并将辅助数组record_dpv中的信息更新为新源依赖;若不是,则跳至s7;
[0119]
s7.若k==n,则本次超图更新结束;否则,令k=k+1,跳至步骤s4;
[0120]
s8.若继续插入、删除超边,跳至s2;否则,算法结束。接下来,针对每个步骤进行具体阐述:
[0121]
s1.首先在初始超图h上执行一次静态算法,初始化辅助数组,记录顶点在初始超图上的相关信息,其中:三维数组record_levels保存以每个顶点为源点在超图中产生的宽搜结果;二维数组record_npv保存任意顶点vk(k=1...n)到其他顶点的最短路径数;二维数组record_npe保存任意顶点vk(k=1...n)到其他超边的最短路径数;二维数组record_dpv保存任意顶点vk(k=1...n)对其他顶点的源依赖;一维数组bc保存顶点vk(k=1...n)的bc值。
[0122]
s2.判断超边e0的更新类别,若是插入,跳至s2.1.1;若是删除,跳至s2.2.1。
[0123]
s2.1.1.为新插入的超边生成超边号edge_index为当前最大的超边号+1,并将超图的边数m加1。
[0124]
s2.1.2.将新插入的超边信息添加至超图中,跳至s3.
[0125]
s2.2.1.将超图的边数m减1。
[0126]
s2.2.2.将删除的超边信息从超图中删除。
[0127]
s3.通过以超边e0中的顶点为源点执行宽搜,得到距离信息,来判断顶点的类别。
[0128]
s3.1.初始化一维数组max记录在更新前的超图中,顶点vk(k=1...n)到e0的最长距离,初始化为0;一维数组min记录在更新前的超图中,顶点vk(k=1...n)到e0的最短距离,初始化为max。
[0129]
s3.2.若更新状态为插入,初始化一维数组unreach记录在更新前的超图中,超边e0中是否有顶点vk(k=1...n)不可达的顶点,初始化为1,表示都可达;一维数组detae记录顶点vk(k=1...n)到超边e0的最短路径数,初始化为0。
[0130]
s3.3.遍历超边e0中的每个顶点p,通过辅助数组中记录的顶点p的宽搜结果,维护数组max、min、(unreach、detae)。
[0131]
s3.3.1.遍历辅助数组record中保存的顶点p的levels集合record_levels[p],得到顶点p到任意顶点vk的距离curr_d,若大于max[k],则令max[k]=curr_d;若小于min[k],则令min[k]=curr_d;若更新状态为超边删除,直接跳至s3.3.5;
[0132]
s3.3.2.初始化一维数组reach_temp为0,表示顶点p到任意顶点vk(k=1...n)的可到达情况。
[0133]
s3.3.3.若curr_d小于min[k],则令detae[k]为record中保存的顶点p到顶点k的最短路径数record_npv[p][k];若curr_d等于min[k],则将detae[k]累加record_npv[p][k]。对record_levels[p]中的每个顶点vk的reach_temp[k]置1表示顶点vk为顶点p可达的顶点。
[0134]
s3.3.4.将reach_temp[k]=0的顶点vk的unreach[k]置0,表示超边e0中存在顶点vk不可达的顶点。
[0135]
s3.3.5.若未遍历完,则令p为e0中下一个顶点,跳至s3.3.1;
[0136]
s4.取超图中的顶点vk,根据max、min、unreach数组中的值,判断顶点vk(k=1...n)类别。若更新状态是插入,跳至s4.1.1.;若更新状态是删除,跳至s4.2;
[0137]
s4.1.1.若unreach[k]==0,跳至s4.1.2;若unreach[k]==1,跳至s4.1.3;
[0138]
s4.1.2.若max[k]==0且min[k]==max,则顶点vk为a4类顶点;否则顶点vk为a5类顶点。跳至s4.
[0139]
s4.1.3.若max[k]==min[k],则顶点vk为a1类顶点;若max[k]==min[k]+1,则顶点vk为a2类顶点;否则,顶点vk为a3类顶点。跳至s4.
[0140]
s4.2.若max[k]==0且min[k]==max,则顶点vk为d3类顶点;若max[k]==min[k],则顶点vk为d1类顶点;若max[k]》min[k],则顶点vk为d2类顶点。
[0141]
s5.根据顶点vk的类别执行对应的更新策略。
[0142]
s5.1.根据min[k]的值可以得到更新的超边所在的超边边界fe在levels集合中的位置为2*min[k]+1。
[0143]
s5.2.初始化二维数组levels为辅助数组record中保存的以顶点vk为源点,在更新前的超图中的宽搜结果record_levels[k];一维数组npv=record_npv[k];一维数组npe=record_npe[k];一维数组dpv=record_dpv[k]。
[0144]
s5.3.若为不受影响的a1类顶点,跳至s5.4;
[0145]
若为受影响的a2类顶点,跳至s5.5;
[0146]
若为受影响的a3类顶点,跳至s5.6;
[0147]
若为不受影响的a4类顶点,跳至s5.7;
[0148]
若为受影响的a5类顶点,跳至s5.6;
[0149]
若为不受影响的d1类顶点,跳至s5.8;
[0150]
若为受影响的d2类顶点,跳至s5.9;
[0151]
若为不受影响的d3类顶点,跳至s6.(不需要对不受影响的d3类顶点进行任何更新)
[0152]
s5.4.不受影响的a1类顶点的正向更新
[0153]
s5.4.1.在顶点vk的levels[2*min[k]+1]出插入新的超边;
[0154]
s5.4.2.更新顶点vk的npe[edge_index]为顶点k到该超边的最短路径数;
[0155]
s5.4.2.更新record_levels、record_npe中的记录。
[0156]
s5.5.受影响的a2类顶点的正向更新(部分增量更新策略)
[0157]
s5.5.1.在顶点vk的levels[2*min[k]+1]出插入新的超边;
[0158]
s5.5.2.更新顶点vk的npe[edge_index]为顶点k到该超边的最短路径数;
[0159]
s5.5.3.以{e0}为初始超边边界开始正向宽搜,根据顶点与超边之间的祖先关系依次找到与e0相关的顶点或超边,即顶点vk到这些顶点或超边的最短路径通过超边e0。在宽搜过程中同步增量更新vk到顶点或超边的最短路径数,某顶点最短路径数的增量,等于宽搜过程所涉及的该顶点的前置超边的最短路径数增量之和,超边的最短路基数增量同理。
[0160]
s5.5.4.更新record_levels、record_npv、record_npe中的记录。s5.6.受影响的a3类顶点、受影响的a5类顶点的正向更新(部分宽搜策略)
[0161]
s5.6.1.在顶点vk的levels[2*min[k]+1]出插入新的超边;
[0162]
s5.6.2.更新顶点vk的npe[edge_index]为顶点k到该超边的最短路径数;
[0163]
s5.6.3.将e0所在的超边边界之后的边界清空,即将levels[2*min[k]+1]之后的levels集合清除。
[0164]
s5.6.4.对于levels[2*min[k]+1]上方的边界(包levels[2*min[k]+1])所包含的元素之外的元素,将npv和npe中对应的最短路径数清零。
[0165]
s5.6.5.以{e0}所在的超边边界为初始边界,开始正向宽搜。在过程中将新的顶点与超边边界添加到levels集合中,同时在npv和npe中更新顶点或超边的最短路径数。
[0166]
s5.6.6.更新record_levels、record_npv、record_npe中的记录。s5.7.不受影响的a4类顶点的正向更新
[0167]
s5.7.1.在npe中加入vk到e0的最短路径数:npe[edge_index]=0
[0168]
s5.7.2.更新record_npe中的记录。
[0169]
s5.8.不受影响的d1类顶点的正向更新
[0170]
s5.8.1.在levels[2*min[k]+1]中将e0删除。
[0171]
s5.8.2.将顶点vk的npe[edge_index]清零。
[0172]
s5.8.3.更新record_levels、record_npe中的记录。
[0173]
s5.9.受影响的d2类顶点的正向更新(部分宽搜策略)
[0174]
s5.9.1.在levels[2*min[k]+1]中将e0删除;
[0175]
s5.9.2.将顶点vk的npe[edge_index]清零;
[0176]
s5.9.3.将e0所在的超边边界之后的边界清空,即将levels[2*min[k]+1]
[0177]
之后的levels集合清除。
[0178]
s5.9.4.对于levels[2*min[k]+1]上方的边界(包levels[2*min[k]+1])所包含的元素之外的元素,将npv和npe中对应的最短路径数清零。
[0179]
s5.9.5.以{e0}所在的超边边界为初始边界,开始正向宽搜。在过程中将新的顶点与超边边界添加到levels集合中,同时在npv和npe中更新顶点或超边的最短路径数。
[0180]
s5.9.6.更新record_levels、record_npv、record_npe中的记录。
[0181]
s6.对于受影响的a2类顶点、受影响的a3类顶点、受影响的a5类顶点、受影响的d2类顶点,这4类源依赖受影响的顶点,反向累积计算新的源依赖,并更新超图中顶点的中介中心性。
[0182]
s6.1.若顶点为不受影响的a1类顶点、不受影响的a4类顶点、不受影响的d1类顶点、不受影响的d3类顶点,跳至s7;否则,执行s6.2;
[0183]
s6.2.初始化一维数组dpv,用于存储顶点vk对其他顶点的新源依赖;初始化一维数组dpv_old=record_dpv[k]为在更新前的超图中,顶点vk对其他顶点的旧源依赖。
[0184]
s6.3.执行反向累积计算顶点vk对其他顶点vq的新源依赖,dpv[q];
[0185]
s6.3.更新每个顶点vq的中介中心性,bc[q]-dpv_old[q]+dpv[q];
[0186]
s6.4.更新record_dpv[k]的记录。
[0187]
s7.判断是否已识别过超图中所有顶点的类别,并执行对应的更新策略与反向累积更新中介中心性。若未遍历完全部顶点,则跳至s4。若遍历完,更新record_bc中的记录,本次超边插入或删除结束。
[0188]
s8.若继续进行超边的插入、删除,则跳至s2;否则,算法结束。
[0189]
如图2所示,在图1的超图h中插入超边e5={v2,v4,v5}顶点v6的levels集合。根据本技术的顶点分类与更新策略,v1与v6为不受影响的a1类顶点,v3为受影响的a2类顶点,v2、v4、v5为受影响的a3类顶点,v7、v8、v9为不受影响的a4类顶点。对于v1与v6的正向更新,仅需要在levels集合的相应位置加入新超边e5,并记录其最短路径数即可;对于v3的正向更新,需要对到v5、v6的最短路径数进行更新;对于v2、v4、v5的正向更新,需要进行部分宽搜,在本实例中,相当于三次完整的正向宽搜过程。在反向累积计算新源依赖时,可以跳过v1与v6这2个源依赖不受影响的顶点。每次计算出新的源依赖后,通过增量更新的方式更新所有顶点的中介中心性。遍历完所有顶点后,结束本次更新。
[0190]
若在图2所示的超图h中删除刚刚插入的超边e5={v2,v4,v5},根据本技术的顶点分类与更新策略,v1与16为不受影响的d1类顶点,v2、v3、v4、v5为受影响的d2类顶点,v7、v8、v9为不受影响的d3类顶点。对于v1与v6的正向更新,仅需要在levels集合的相应位置删除超边e5,并将其最短路径数清零即可;对于v2、v3、v4、v5的正向更新,需要执行部分宽搜策略;对于v7、v8、v9不需要进行任何的正向更新。在反向累积计算新源依赖时,可以跳过v1、v6、v7、v8、v9这5个源依赖不受影响的顶点。每次计算出新的源依赖后,通过增量更新的方式更新所有顶点的中介中心性。遍历完所有顶点后,结束本次更新。
[0191]
在上方的实例中可以发现,本发明提出的动态更新算法能通过对顶点的分类与更新策略,来避免使用静态算法进行更新时的部分不必要的计算过程,加快更新速度。
[0192]
如图3所示,横坐标为6个真实的数据集,纵坐标为相比于静态算法,使用本技术的维护方式进行计算时的加速比,
[0193]
以上所述仅为本技术的优选实施例而已,并不用于限制本技术,对于本领域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1