我已将邻接列表实现为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版本的任何想法?
答案 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万边缘。