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
、私の状態が悪くなります。cache
トレイトでインスタンス化cache
すると、メソッド呼び出しの周りに巨大なブロックを配置するだけなSynchronizedMap
ので、すべてのフォークがスレッド ブロックに参加します。では、メモ化と並行して再帰的な分割統治アルゴリズムを実行するための Scala のイディオムは何ですか?SynchronizedMap
synchronized
getOrElseUpdate