Graphx的数三角形算法TriangleCount用于统计每个顶点所在的三角形个数。

1.1 简介

对网络图中进行三角形个数计数可以根据三角形数量反应网络中的稠密程度和质量。

1.2 应用场景

(一)用于社区发现

如微博中你关注的人也关注你,大家的关注关系中有很多三角形,说明社区很强很稳定,大家联系比较紧密;如果一个人只关注了很多人,却没有形成三角形,则说明社交群体很小很松散。

(二)衡量社群耦合关系的紧密程度

通过三角形数量来反应社区内部的紧密程度,作为一项参考指标。

1.3 算法思路

计算规则:

如果一条边的两个顶点有共同的邻居,则这三个点构成三角形。

计算步骤:

1. 为每个节点计算邻居集合

2. 对于每条边,计算两端节点邻居集合的交集,将交集中元素个数告知两端节点,

该个数即对应着节点关联的三角形数。

3. 对每个节点合并三角形数目统计总数,由于三角形中一个顶点关联两条边,所以

对于同一个三角形而言,一个顶点计算了两次,故最终结果需要除以2。

1.4 源码解析

object TriangleCount {

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

// Transform the edge data something cheap to shuffle and then canonicalize

//得到的是一个无自连边且无重复边的、边是从小id指向大id的图

val canonicalGraph = graph.mapEdges(e => true).removeSelfEdges().convertToCanonicalEdges()

// Get the triangle counts

val counters = runPreCanonicalized(canonicalGraph).vertices

// Join them bath with the original graph

graph.outerJoinVertices(counters) { (vid, _, optCounter: Option[Int]) =>

optCounter.getOrElse(0)

}

}

def runPreCanonicalized[VD: ClassTag, ED: ClassTag](graph: Graph[VD, ED]): Graph[Int, ED] = {

// 构建邻居集合

val nbrSets: VertexRDD[VertexSet] =

// 收集邻居节点,边方向为Either,保证点的入边和出边连接的邻居点都会被收集

graph.collectNeighborIds(EdgeDirection.Either).mapValues { (vid, nbrs) =>

val set = new VertexSet(nbrs.length)

var i = 0

while (i < nbrs.length) {

// prevent self cycle

if (nbrs(i) != vid) {

set.add(nbrs(i))

}

i += 1

}

set

}

// 更新图中顶点的属性为邻居点集合

val setGraph: Graph[VertexSet, ED] = graph.outerJoinVertices(nbrSets) {

(vid, _, optSet) => optSet.getOrElse(null)

}

def edgeFunc(ctx: EdgeContext[VertexSet, ED, Int]) {

// 在边上操作源点和终点的邻居集合是,遍历较小的集合,加快遍历速度

val (smallSet, largeSet) = if (ctx.srcAttr.size < ctx.dstAttr.size) {

(ctx.srcAttr, ctx.dstAttr)

} else {

(ctx.dstAttr, ctx.srcAttr)

}

val iter = smallSet.iterator

var counter: Int = 0

while (iter.hasNext) {

val vid = iter.next()

if (vid != ctx.srcId && vid != ctx.dstId && largeSet.contains(vid)) {

counter += 1

}

}

ctx.sendToSrc(counter)

ctx.sendToDst(counter)

}

// 沿着图中的边计算两个顶点的邻居集合的交集,并为每个顶点合并消息(消息为三角形个数)

val counters: VertexRDD[Int] = setGraph.aggregateMessages(edgeFunc, _ + _)

graph.outerJoinVertices(counters) { (_, _, optCounter: Option[Int]) =>

val dblCount = optCounter.getOrElse(0)

// 算法为每个三角形计算了两次,所以结果是偶数

require(dblCount % 2 == 0, "Triangle count resulted in an invalid number of triangles.")

dblCount / 2 //注意最后需要除以2,每个三角形被计算了两遍

}

}

}

spark的数三角形算法_Graphx图算法【1】三角形TriangleCount相关推荐

  1. Spark中常用的算法

    Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要 ...

  2. 大数据开发超高频面试题!大厂面试必看!包含Hadoop、zookeeper、Hive、flume、kafka、Hbase、flink、spark、数仓等

    大数据开发面试题 包含Hadoop.zookeeper.Hive.flume.kafka.Hbase.flink.spark.数仓等高频面试题. 数据来自原博主爬虫获取! 文章目录 大数据开发面试题 ...

  3. 用动态规划算法编程实现数字三角形问题

    用动态规划算法编程实现数字三角形问题 前言 一.用动态规划算法编程实现数字三角形问题 如下所示为一个数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 请编一个程序计算从顶至底的 ...

  4. JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码)

    JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码) fibonacciNthClosedForm.js完整源代码 fibonacci ...

  5. JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码)

    JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码) fibonacciNth.js完整源代码 fibonacciNth.js完整源代码 export ...

  6. C语言求网格的最大不重复路径数的算法(附完整源码)

    C语言求网格的最大不重复路径数的算法 C语言求网格的最大不重复路径数的算法完整源码(定义,实现,main函数测试) C语言求网格的最大不重复路径数的算法完整源码(定义,实现,main函数测试) #in ...

  7. spark.mllib:回归算法

    Spark实现了三类线性回归方法: 1.LinearRegression:普通线性回归模型 2.LassoRegression:加L1正则化的线性回归 3.RidgeRegression:加L2正则化 ...

  8. 【算法】组合数学——排列数生成算法详解(一)

    组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处. 不论是哪种全排列生成算法,都遵循着"原排列& ...

  9. Python实现相空间重构求关联维数——GP算法、自相关法求时间延迟tau、最近邻算法求嵌入维数m

    Python实现相空间重构求关联维数--GP算法.自相关法求时间延迟tau.最近邻算法求嵌入维数m GP算法: 若有一维时间序列为{x1,x2,-,xn},对其进行相空间重构得到高维相空间的一系列向量 ...

  10. JS逆向瑞数4算法专题一

    遇到无限Debugger怎么办 1.选择这个Never pause here 就可以了 或者 点击第三个 里面填上False 都是可以的 2. 使用本地替换 就可以了 3. 当我们遇到这种 异步的 就 ...

最新文章

  1. 秒懂 QPS、TPS、PV、UV、IP!
  2. python 读plt文件_用python读Excel文件
  3. rust面向对象_面向初学者的Rust操作员综合教程
  4. python egg
  5. java编程方向_java网络编程方向具体该怎么去学
  6. 旅游中用稳定器和相机拍视频是怎样的体验?
  7. webuploader
  8. 出现这6种评估违法状况,征收补偿决定可能被撤销!
  9. C#的GC机制(来自网摘复制,未整理)
  10. android ndk 架构,NDK需要特别注意的armeabi等架构问题
  11. delphi在linux运行,实现了delphi unigui跑在linux上
  12. 多电量变送器在消防巡检设备中的应用
  13. 《21世纪的书:信息时代商业思想10×10阅读》書目信息
  14. 数据库防火墙的性能和高可用性分析
  15. 摩根大通的企业级区块链解决方案—Quorum
  16. 最新yar扩展安装和使用
  17. 使用大白菜U盘重装系统
  18. linux 编辑模式使用sed,sed命令的用法和vim编辑器的使用
  19. HDU 4509 hash
  20. 【SSL_1715】计算面积

热门文章

  1. PowerVR SDK记录
  2. 00 SQL课程简介
  3. 路过图床插件,支持一键上传返回各类链接
  4. Unity打Android包报错Error building Player Exception OBSOLETE - Providing Android resources in AssetsPlug
  5. vlan划分-通过物理接口实现vlan通信
  6. 我不恨你,我只恨我们有缘无分
  7. STM32时钟--基于正点原子STM32视频教程
  8. python win32gui模块详解_pythonwin-win32gui 窗口查找和遍历
  9. hp服务器修改阵列,HP ProLiant 服务器 修改磁盘阵列的方法
  10. 什 么 是 勒 索 病 毒 ?