【发布时间】:2013-01-07 21:15:14
【问题描述】:
我在 Scala 中有一个记忆的分而治之算法:
val cache = mutable.Map[Int, BigInt]()
cache(1) = BigInt(0)
def dp(n: Int): BigInt = cache.getOrElseUpdate(n, {
partitions(n).map(i => dp(i)).min
// partitions is non-recursive function that given an Int returns a list[Int]
})
然而,我想通过将partitions(n) 更改为partitions(n).par 来将此代码转换为使用并行化,而partitions(n).par 则返回一个并行列表。但是现在,我的cache 状态不佳,因为该映射不是并发的。当我用SynchronizedMap trait 实例化cache 时,我所有的fork 都会加入线程块,因为所有SynchronizedMap 所做的只是在getOrElseUpdate 方法调用周围放置一个巨大的synchronized 块。那么,使用记忆化并行执行递归分治算法的 Scala 习语是什么?
【问题讨论】:
标签: scala recursion concurrency dynamic-programming memoization