找到Scala合并算法的瓶颈

时间:2015-01-23 17:29:06

标签: performance algorithm scala

我正在学习Scala,作为一个起点,我正在尝试编写一个mergeSort算法。我对它的合并部分的性能有问题。

我知道这个网站上还有其他实现,但我想知道为什么我的工作效果不佳。

这是我的代码:

@tailrec
    def merge(l1:List[Int], l2:List[Int], acc:List[Int]): List[Int] = {

      if(l1.isEmpty || l2.isEmpty) l1 ++ l2 ++ acc
      else if(l1.last> l2.last) merge(l1.init, l2, l1.last :: acc)
      else  merge(l1, l2.init, l2.last :: acc)
    }

    val a1 = List(1,4,65,52151) 
    val a2 = List(2,52,124,5251,124125125)

    println(merge(a1, a2, List()))

如何看待合并函数是尾递归的(如果我没有错),我使用的列表方法应该花费一些时间。

代码变得非常慢,列表中有100000个元素。

2 个答案:

答案 0 :(得分:3)

列表中的

lastinit非常昂贵:O(N)。有效的操作是headtail:O(1)。如果你不能在开始时工作,请事先反转列表(O(N)但只反复一次,而不是每次迭代),或者在结束时反转输出,但是你需要在开始时工作。名单。

答案 1 :(得分:0)

找到瓶颈的最佳方法是使用分析器。我知道netbeans有一个免费的;如果你能得到jprofiler或yourkit他们非常好用。在这个特定情况下,我指出lastinit是O(n),因为List是(单个)链接列表。