Effective and Efficient Community Search over Large Heterogeneous Information Networks(2)

3.1 basic (k,p)core算法。
在这个部分我们提出了两个查询算法,基础算法和改进算法。
3.1.1基础算法
基础算法为了搭建一个同构图Gp,然后返回包含q的k-core。特别的有三个步骤:1.先收集包含所有目标类型点的集合;2.对于每一个属于s集合的点,如果他们可以通过p方式连接则添加一条边;3.找到包含p的k-core。但是,这个算法对于大型的hin且较长的matepath来说是非常耗时的,因为在步骤2中,path的长度可能会很长,耗时长达, O(n^l),n是p路径上的点种类中最大数量的点,l是p路径的长度。为了优化步骤2,我们提出了批量查询策略。替代列举所有的路径,我们分解p变成一系列边,然后批量查找匹配的点对于每条边。我们称改进的算法为hombcore,算法。简单的 bfs。
3.1.2改进算法
hombcore算法的限制是不得不构建一个全是目标类型点的同构图。但是,这个是非常耗时且没必要的,因为在步骤1中并不是所有的点都与q连接,并且在步骤2中是对图中所有的点就行枚举。为了解决这些问题,我们提出标签的策略,命名为带标签的批量查询bsl和带标签的深度搜索dsl。
带标签的批量查询bsl。bsl是为了有效的查找所有与q连接的点。bsl是基于hombcore。算法2(1-11)是bsl详细展示。特别的,我们首先查找q的邻居集合使用批量查询。在这个过程中,无论我们什么时候找到u,v满足p路径上边的时候,如果没有标签i则贴身i,否则跳过。注意最初边没有标签。下一次迭代中,继续查找与y集合中相连的边。这个过程一直运行直到所有的边都有标签。明显的,每一条边都可以获取通过不断地标签。因此,查找一个与q连接的集合s的时间接近线性。
带标签的深度搜索dsl。回想一下定义,Bk只需要其中每个点至少有k个邻居。同时,在现存的cs研究中,k通常不会太大。受这个观察启发,我们提出动态的维护到每个点都有k个邻居。特别的,我们首先发现每个都有k个邻居的点,然后迭代的移除不满足k的点。因为移除点v,同时也会移除每个v邻居的一个邻居,所有我们需要逐渐的提供每个v的邻居新的邻居。为了找到这些增加的邻居,我们提出了dsl策略。
特别的,使用dfs找到一个p路径之后,我们检查每一个p上的点,如果他每个邻居都访问了,那么标记vis。当我们查询剩余的点这些已标记的点将不会考虑。这个确保每条边都会被访问恒定的次数。时间复杂度。。。
基于bsl和dsl,我们提出了改进算法fastbcore。算法过程:首先,我们使用bsl来查找都与q连接的集合S。然后,对于每条点查找k条路径并且把没有k’条路径的点放入队列Q。然后,迭代的移除一个点从Q,检查v的每一个邻居u,把u-v的路径移除,尝试在s中找到一个点与u有路径,如果存在则添加为u的邻居,否则把u放入队列Q。循环结束后,s中每个点都满足条件。
注意,因为对于每个节点我们只找了k个邻居,我们不能最大的集合。这没看懂。。。
3.2无边重复k-core算法
记得Bk不能从推断出的同构图中计算出。那么问题产生了:我们是否可以获得Ek从同构图中呢?为了获得同构图,
一个简单的方法是通过hombcore获得。显然,这个方法并没有考虑无重复边路径因此会产生不正确的Ek。
另一个方法是建立一个同构图通过贪心。特别的,首先找到p的一条路径(u-v)在异构图G中,然后从G里面移除p路径上所有的边,然后在u,v之间添加一条边。重复这三部直到P中没有路径。但是这个方法同样不能奏效。Ψ[v]代表从v开始的最大无边路径集合。有两个原因:首先Ψ[v并不一定是唯一的。其次,点之间的关系可能是不对称的,因为对于一条路径,他可能出现在Ψ[v]但是Ψ[u]却没有。
因此,Ek并不能从推断出的同构图中计算出。
接着,我们提出了计算β(v, S),的算法,β(v, S)指的是点v的边度数关于在s集合中与q的关联点。基于这些算法,我们提出两个有效的查询算法,第一个是一个点一个点处理,第二个是批量处理点。
3.2.1计算β(v,S)算法
(多部图)可以将图划分成几个集合,集合内的点无连接,而两个集合之间有边相连。
我们首先介绍一个算法叫exact,基于最大流算法。特别的,首先我们建立l+1部图,然后通过这个图获得流量网络。在多部图中,第i个集合包含所有在p路径上的第i个点,同时从这个集合中连出的边是p路径的第i条边与第i+1部图连接的。为了建立流量网络,首先我们获得所有s中的路径。其次我们建立多部图。然后,把v当作源点并且创造一个汇点s,然后连接每一个l+1部图的点到s。最后,我们为每一条边赋值为1.我们用ebuilder定义流量图。
定理2说明了β(v,S)等于F的最大流量。一个例子。。。。
由定理2,我们可以使用现存任何最大流算法去计算β(v,S)。有两个著名的算法,命名为ford-fulkerson算法和orlin算法,前者很经典,后者是最近的方法。。。。在我们的案例中,因为β(v,S)是s值的最大值,。。。因此ford算法比orlin算法更快在我们的流量图中,所以我们使用ford。ford方法计算最大流通过寻找增广路。
exact主要限制是高计算消耗,特别是当β(v,S)很大。为了提高效率,我们提出了更合适的算法,定义为贪心,因为这个算法是以贪心和增广的方式。特别的,有一个点v,首先使用dfs寻找路径p,这个路径由v开始以属于s的点v’结尾,然后从G中移除路径p和点v’。重复直到找不到从v开始的路径p。引理3说明了贪心理论上保证返回的无重复边路径至少是β(v,S)/l。
因为在发现一条路径后所有的边都要移除,贪心的时间耗费呈线性。。。。因此贪心比exact快。ford算法通过增广路计算最大流。在我们的流量图中,通过s连接每一条路径p,我们可以得到源点到汇点的增广路。因此,为了计算β,首先我们用贪心的到一个路径的集合,然后,标记他们作为增广路,最后使exact
寻找剩余的增广路。注意增广路不一定要与p特定得到路径一致。。。。。
3.2.2基于延迟peel算法
受k-core算法剥离范式的启发,我们提出算法来计算Ek通过迭代的移除β值小于k的点。在移除一个点v,我们需要减少β(u,S),因为u是v的一个邻居。但是,减少β(u,S)是有意义的,因为这个值可能是不变的。举个例子。。。为了解决这个问题,很天真的方法是重新计算β(u,S)通过exact。但是,这个方法是非常耗时的因为邻居很多并且运行exact很昂贵。为了解决这个问题,我们提出了延迟peel方法来延迟运行exact尽可能的晚,取决于关键观察在移除v后,β(u,S)最多减一。
特别的,起始对于s中每一个点v,我们使用贪心计算大概的β(v,S)。然后我们维护一个队列,其中是在s中β值少于k的点。无论何时,我们弹出一个点v,我们计算其精确的β值通过exact方法。然后,如果其β值少于k,我们移除v并且对于每个连接的β值减一,如果更新后的β(u,S)小于k,我们把u添加到队列中。换句话说,我们先不更新βus,但是维护βus的边界,直到其β值低于k的时候重新计算其β。
基于上述的讨论,我们对于一个算法叫lazyecore,算法3.首先,由定理1,因为ek包含于bk,先计算bk。其次,初始化一个队列Q和一个数列b来存储βvs。然后,用贪心计算每一个s中点的β值并且把β值少于k的值收集起来。在循环中,一个点一个点收集。特别的,首先,弹出一个点v,如果βvs<k/l,v可以直接移除,另外,引用了exact。如果v能够删除,更新s,每个v的邻居的β值减一,如果其β值低于k则添加u去队列。最后返回ek。

另外学习了最小堆,推荐蒋岩炎老师。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值