美文网首页大数据
Graphx图算法【5】连通分量 ConnectedCompon

Graphx图算法【5】连通分量 ConnectedCompon

作者: 汤圆毛毛 | 来源:发表于2019-10-29 09:25 被阅读0次

Graphx的ConnectComponent求解图中的连通体,在图中任意两个顶点之间存在路径可达,则该图是连通图,对应的极大连通子图即该算法要求的连通体。

5.1 简介

Graphx用图中顶点的id来标识节点所属的连通体,同一个连通体的编号是采用该联通体中最小的节点id来标识的。

5.2 算法场景

(一)社交网络的社区发现

(二)测试机器的连通性或进行网络连接的判断

5.3 算法流程

核心思想: 用图中节点的id来表示连通分量,将自身id传递给邻居节点,能够发送消息的必然是在同一个连通分量中。
这里进行消息传送是从将id节点的id发送给有着更大id的节点。这样最后一个联通分支中的所有节点的分支id将会是该分支中最小的节点id。(消息发送不分方向,既可以沿着出边发送也可以沿着入边发送)

计算步骤:

  1. 首先初始化图,将图中顶点id作为顶点的属性,开始状态是每个节点单独作为一个连通分量,分量id是节点id;
  2. 对于每条边,如果边两端节点属性相同(说明两个节点位于同一连通分量中),不需要发送消息,否则将较小的属性发送给较大属性的节点;
  3. 同一个节点对于收到的多个消息,只接收最小的消息;
  4. 节点将自身属性记录的id与收到的消息中的id进行比较,采用最小的id更新自己的属性。
   
  不断迭代上述2,3,4步。

5.4 源码分析

object ConnectedComponents {
  /**
   *  返回图,图中节点的属性是当前连通分量中最小的顶点id
   * */
  def run[VD: ClassTag, ED: ClassTag](graph: Graph[VD, ED],
                                      maxIterations: Int): Graph[VertexId, ED] = {
    require(maxIterations > 0, s"Maximum of iterations must be greater than 0," +
      s" but got ${maxIterations}")

    // 初始化图:将图中顶点的id作为顶点属性
    val ccGraph = graph.mapVertices { case (vid, _) => vid }
    // 边上两个顶点,将id较小的顶点的属性发送给id较大的顶点(使得最终连通分支的id是分支上最小的节点id)
    // 如果边的两个顶点属性相同,则说明已经在同一个连通分支,不需要发送消息
    def sendMessage(edge: EdgeTriplet[VertexId, ED]): Iterator[(VertexId, VertexId)] = {
      if (edge.srcAttr < edge.dstAttr) {
        Iterator((edge.dstId, edge.srcAttr))
      } else if (edge.srcAttr > edge.dstAttr) {
        Iterator((edge.srcId, edge.dstAttr))
      } else {
        Iterator.empty
      }
    }
    // 初始化消息,因为节点在处理消息时接收最小的id更新自己的属性,所以初始时给每个节点发送一个超大的值
    val initialMessage = Long.MaxValue
    val pregelGraph = Pregel(ccGraph, initialMessage,
      maxIterations, EdgeDirection.Either)(
      vprog = (id, attr, msg) => math.min(attr, msg), // 取当前属性和收到消息的最小者更新属性
      sendMsg = sendMessage,
      mergeMsg = (a, b) => math.min(a, b))            // 接收多个消息中的最小者
    ccGraph.unpersist()
    pregelGraph
  } // end of connectedComponents


  def run[VD: ClassTag, ED: ClassTag](graph: Graph[VD, ED]): Graph[VertexId, ED] = {
    run(graph, Int.MaxValue)
  }
}

相关文章

  • Graphx图算法【5】连通分量 ConnectedCompon

    Graphx的ConnectComponent求解图中的连通体,在图中任意两个顶点之间存在路径可达,则该图是连通图...

  • 数据结构与算法--图论之寻找连通分量、强连通分量

    数据结构与算法--图论之寻找连通分量、强连通分量 寻找无向图的连通分量 使用深度优先搜索可以很简单地找出一幅图的所...

  • Kosaraju算法详解

    Kosaraju算法是干什么的? Kosaraju算法可以计算出一个有向图的强连通分量 什么是强连通分量? 在一个...

  • 强连通分量和Kosaraju算法

    内容概要: 基于深度优先后序遍历的DAG图拓扑排序 强连通分量 求解强连通分量Kosaraju算法 拓扑排序的另一...

  • 图的连通性

    一、连通分量 1.1 定义 连通分量是针对无向图的,无向图G的极大连通子图称为G的连通分量( Connected ...

  • 活动分组——无向图的连通分量个数

    一、相关概念 连通分量 无向图中,极大连通子图称为连通分量1)连通图的连通分量只有一个,即自身2)非连通的无向图有...

  • 常用图算法实现--Spark

    使用Spark实现PageRank,强连通分量等图算法 PageRank 数据准备 边: 网页: 将这两个文件放入...

  • 无向图的双连通分量

    双连通分量 点_双连通分量 BCC对于一个连通图,如果任意两点至少存在两条“点不重复”的路径,则说图是点双连通的(...

  • 图算法(一)遍历,拓扑排序

    本文介绍图的几种基本操作:BFS,DFS,求有向图连通分量的Tarjan算法以及拓扑排序。 图的表示 一张图是由若...

  • 强连通分量算法

    计算机系DSA第二次Programming Assignment中第三题涉及到这个算法 【问题描述】 一个有向图中...

网友评论

    本文标题:Graphx图算法【5】连通分量 ConnectedCompon

    本文链接:https://www.haomeiwen.com/subject/nufsvctx.html