用graphx实现Bronkerbosch计算极大团

15 篇文章 0 订阅
4 篇文章 0 订阅
 
请结合Bronkerbosch算法描述查看,该方法是在朴素的Bronkerbosch算法上进行改进,属于
 
带轴的Bron_Kerbosch算法

 


import org.apache.spark.graphx.{EdgeDirection, GraphLoader}
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.immutable.{Set => ImmutableSet}
import scala.collection.mutable.Set
val graph = GraphLoader.edgeListFile(sc,"hdfs://master:9000/ljq/10W")

 

 

val neighbourVerticesMap = graph.collectNeighborIds(EdgeDirection.Either).collect().map(vertex => (vertex._1.asInstanceOf[Long], vertex._2.toSet)).toMap;
var keySet = neighbourVerticesMap.keySet
//ress 可以为邻点集合  也可以为一步之内的集合
var ress = scala.collection.mutable.Map.empty[Long,ImmutableSet[Long]]
for (key<-keySet){
  /*var newSet = neighbourVerticesMap.get(key).get
  for (s<-newSet){
    newSet = newSet.union(neighbourVerticesMap.get(s).get)
  }
  ress.put(key,newSet.-(key))*/
  ress.put(key,neighbourVerticesMap.get(key).get)
}
  val vert =graph.vertices.map(x=>{
    x._1.toLong
  })

 

var count = 0
def findCliques(potentialClique: Set[Long],candidates: Set[Long], alreadyFound: Set[Long],cliques: Set[Set[Long]])
: Unit = {
 // println(count)
  count = count+1
  if (candidates.isEmpty && alreadyFound.isEmpty) {
    cliques.add(potentialClique)
  }else {
    var diffSet = candidates.diff(ress.get(candidates.union(alreadyFound).last).get)//轴
    diffSet.foreach(candidateVertex => {
      //每个点对应的N步长以内的点集合
      var neighbourVertices = ress.get(candidateVertex).get
      findCliques(potentialClique ++ Set(candidateVertex),
        candidates.intersect(neighbourVertices), //交集
        alreadyFound.intersect(neighbourVertices),cliques)
      alreadyFound += candidateVertex
      candidates.remove(candidateVertex)
    })
  }
}
def runAlgorithm = {
  var potentialClique = Set[Long]()
  var candidates =Set[Long]()
  vert.collect().foreach(x=>{
    candidates.add(x)
  })
  var alreadyFound = Set[Long]()
  var cliques = Set[Set[Long]]()
  var start: Long = System.currentTimeMillis()
  findCliques(potentialClique,candidates ,alreadyFound, cliques)
  println(System.currentTimeMillis()-start+"ms-------------")
  cliques
}
var bk= runAlgorithm

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不加班程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值