图表作为邻接列表性能

时间:2014-01-25 16:54:27

标签: scala

我已将邻接列表实现为Array[List[Int]],基本图形创建例程就像这样

  val edges : List[(Int, Int)] = ... 
  val adj = Array.fill(v)(List.empty[Int])
  edges foreach { case(t, h) => adj(t) = h::adj(t) }

与基于ArrayList<Integer>[]的Java实现相比,此实现大约慢四倍(使用500万边缘测试)。在Java中,边缘最初存储为ArrayList<int[]>。关于如何更快地使Scala版本的任何想法?

1 个答案:

答案 0 :(得分:0)

对于边的初始集合,

scala> val edges : List[(Int,Int)] = List((1,2),(1,3),(1,4),(2,3),(2,4),(3,4))
e: List[(Int, Int)] = List((1,2), (1,3), (1,4), (2,3), (2,4), (3,4))

考虑这种重新安排,

scala> val adj = edges.groupBy{_._1}.map { case (k,v) => (k, v.map {_._2}) }
res21: scala.collection.immutable.Map[Int,List[Int]] = Map(2 -> List(3, 4), 1 -> List(2, 3, 4), 3 -> List(4))

也许使用par方法,它提供给定集合及其相关方法的并行实现,

scala> val adj = edges.par.groupBy{_._1}.map { case (k,v) => (k, v.map {_._2}) }

可以提高效率,特别是对于大型集合,例如原始的500万边缘。