Spark GraphX实现Bron–Kerbosch算法-极大团问题

2024-02-28 11:40

本文主要是介绍Spark GraphX实现Bron–Kerbosch算法-极大团问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,说明两个概念:团、极大团。

  • clique)是一个无向图(undirected graph )的子图,该子图中任意两个顶点之间均存在一条边。又叫做完全子图。
  • 极大团(maximal clique)是一个团,该团不能被更大的团所包含,换句话说,再也不存在一个点与该团中的任意顶点之间存在一条边。

研究极大团的问题对社区发现等场景有较高的理论价值和现实意义。求一个无向图中的极大团问题是一个经典的NP完全问题,1973年曾提出了一个Bron-Kerbosch算法用来解决该问题,其伪代码如下:

 BronKerbosch(R, P, X):if P and X are both empty:report R as a maximal cliquefor each vertex v in P:BronKerbosch(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))P := P \ {v}X := X ⋃ {v}

该算法中有四个集合:R,P,X,N(v),其中:

R:目前已经在团中的顶点的集合

P:可能在团中的顶点的集合

X:不被考虑的顶点的集合

N(v):顶点v的所有直接邻居


以一个6个顶点的图为例:


用Spark GraphX实现Bron Kerbosch算法,搜索该图的极大团,代码如下:

import org.apache.spark.graphx.{Edge, EdgeDirection, Graph, VertexId}
import org.apache.spark.{SparkConf, SparkContext}import scala.collection.mutable
import scala.collection.mutable.Setobject FindMaximalCliques {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("findMaximalCliques").setMaster("local")val sc: SparkContext = new SparkContext(conf)//定义顶点val vertexArray = Array((1L,null),(2L,null),(3L,null),(4L,null),(5L,null),(6L,null))//定义边val edgeArray = Array(Edge(6L, 4L,null),Edge(4L, 3L,null),Edge(4L, 5L,null),Edge(5L, 2L,null),Edge(3L, 2L,null),Edge(5L, 1L,null),Edge(2L, 1L,null))//顶点和边转化为RDDval vertexRDD = sc.parallelize(vertexArray)val edgeRDD  = sc.parallelize(edgeArray)//根据顶点和边创建图val graph= Graph(vertexRDD,edgeRDD)//创建一个Map集合。key是图中的所有顶点;value是一个Set集合,保存了该key的所有邻居顶点val map: Map[VertexId, Set[VertexId]] = graph.collectNeighborIds(EdgeDirection.Either).collect().map(t => {var set: mutable.Set[VertexId] = Set[VertexId]()t._2.foreach(t=>{set+=t})(t._1, set)}).toMap//R集合,初始值为空var R = Set[VertexId]()//P集合,初始值为所有的顶点var P = Set[VertexId]()//将所有的顶点添加到P集合中vertexRDD.collect().foreach(t=>{P+=t._1})//X集合,初始值为空var X = Set[VertexId]()//搜索极大团bronKerboschl(R,P,X,map)}/*** 搜索极大团的方法* @param R 目前已经在团中的顶点的集合* @param P 可能在团中的顶点的集合* @param X 不被考虑的顶点的集合* @param map Map集合,通过顶点获取该顶点的所有邻居顶点集合*/def bronKerboschl(R:Set[VertexId],P:Set[VertexId],X:Set[VertexId],map:Map[VertexId, Set[VertexId]]): Unit ={if(P.toList.length ==0 && X.toList.length ==0){println("find a maximal cilique:"+R)}else {for (v <- P) {var Nv: Set[VertexId] = map.get(v).getbronKerboschl(R+v, P.intersect(Nv), X.intersect(Nv), map)X += vP -= v}}}}

结果为:

find a maximal cilique:Set(1, 5, 2)
find a maximal cilique:Set(5, 4)
find a maximal cilique:Set(2, 3)
find a maximal cilique:Set(6, 4)
find a maximal cilique:Set(3, 4)


这篇关于Spark GraphX实现Bron–Kerbosch算法-极大团问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755401

相关文章

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出