我在 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
which 返回并行列表。但是现在,我的状态很糟糕,cache
因为该地图不是并发的。cache
当我使用trait进行实例化时,我的SynchronizedMap
所有 fork 都会加入线程块,因为所做的只是在方法调用周围SynchronizedMap
放置一个巨大的块。那么,在记忆化的同时进行递归分治算法的 Scala 习语是什么?synchronized
getOrElseUpdate