performance - 寻找 Scala 合并算法的瓶颈

标签 performance algorithm scala

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

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

这是我的代码:

@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 个元素的列表,代码变得非常慢。

最佳答案

lastinit 在 List 上的开销非常大:O(N)。高效的操作是 headtail:O(1)。如果您无法在开始时工作,请预先反转列表(O(N),但仅一次,而不是在每次迭代时),或者在最后反转输出,但您需要在列表的开头工作。

关于performance - 寻找 Scala 合并算法的瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115440/

相关文章:

arrays - 按递增顺序对 2d 点进行排序的算法

algorithm - 为什么Leetcode的 "Meeting Rooms 2"数组要先排序?

c - 在循环中填充数组

json - 如何在 Play Framework 中的 Json 读取中添加自定义验证错误

java - HashSet vs ArrayList CPU 使用率高

Java 分析问题

javascript - 根据条件执行不同的函数,无需if语句

javascript - 取消选中大型 (1000) 数据集上的复选框时,Knockout 速度很慢

c# - 分组 : for comprehensions in scala vs .net linq

scala - 为什么加入两个数据集并应用过滤器会导致 “error: constructor cannot be instantiated to expected type”?