【发布时间】:2015-01-23 17:29:05
【问题描述】:
我正在学习 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 个元素的列表,代码变得非常慢。
【问题讨论】:
-
正如 Didier 指出的那样,当使用
Lists 时,您希望将它们用作堆栈,即使用head和tail。您可能想尝试使用Vectors 作为练习,以查看性能差异。当然,对于对性能至关重要的代码,您可能会改用Arrays。
标签: performance algorithm scala