ScalaFuturesを使用して並列マージソートを作成しようとしました。ただし、Eclipseのインタープリター内でサイズ100 000のリストでアルゴリズムを実行すると、すべてが非常に遅くなり、最終的にはメモリが不足していることを示すエラーメッセージが表示されます。コマンドラインからインタープリターで実行すると、サイズ10000のリストで既にハングしています(ただし、エラーメッセージは表示されません)。
なぜこれが発生し、修正がありますか?
import scala.actors.Future
import scala.actors.Futures._
object MergeSort{
def sort[T <% Ordered[T]](toBeSorted :List[T]) :List[T] = toBeSorted match{
case Nil => Nil
case List(x) => List(x)
case someList =>
val (left, right) = someList splitAt someList.length/2
val sortedLeft = future { sort(left) }
val sortedRight = sort(right)
merge(sortedLeft(), sortedRight, Nil)
}
def merge[T <% Ordered[T]](a :List[T], b :List[T], Ack: List[T]) :List[T] = (a, b) match {
case (Nil, ys) => Ack.reverse ++ ys
case (xs, Nil) => Ack.reverse ++ xs
case (x::xs, y::ys) if x < y => merge(xs, y::ys, x::Ack)
case (x::xs, y::ys) => merge(x::xs, ys, y::Ack)
}
}