相关疑难解决方法(0)

Scala Memoization:这个Scala备忘录是如何工作的?

以下代码来自Pathikrit的动态编程存储库.我的美丽和独特使我感到困惑.

def subsetSum(s: List[Int], t: Int) = {
  type DP = Memo[(List[Int], Int), (Int, Int), Seq[Seq[Int]]]
  implicit def encode(key: (List[Int], Int)) = (key._1.length, key._2)

  lazy val f: DP = Memo {
    case (Nil, 0) => Seq(Nil)
    case (Nil, _) => Nil
    case (a :: as, x) => (f(as, x - a) map {_ :+ a}) ++ f(as, x)
  }

  f(s, t)
}
Run Code Online (Sandbox Code Playgroud)

该类型Memo在另一个文件中实现:

case class Memo[I <% K, K, O](f: I => O) extends (I => …
Run Code Online (Sandbox Code Playgroud)

scala memoization dynamic-programming

24
推荐指数
1
解决办法
7637
查看次数

在Scala中,案例类的"扩展(A => B)"是什么意思?

在研究如何在Scala中进行Memoization时,我发现了一些我没有理解的代码.我试图看看这个特别的"东西",但不知道该怎么称呼它; 即引用它的术语.另外,用符号搜索并不容易,唉!

我在这里看到以下代码在Scala中进行memoization :

case class Memo[A,B](f: A => B) extends (A => B) {
  private val cache = mutable.Map.empty[A, B]
  def apply(x: A) = cache getOrElseUpdate (x, f(x))
}
Run Code Online (Sandbox Code Playgroud)

这就是案例类正在扩展的内容,这让我感到困惑extends (A => B).首先,发生了什么?其次,为什么甚至需要呢?最后,你称之为这种继承; 即是否有一些特定的名称或术语可供我参考?

接下来,我看到这样计算Fibanocci号码使用备注这里:

  val fibonacci: Memo[Int, BigInt] = Memo {
    case 0 => 0
    case 1 => 1
    case n => fibonacci(n-1) + fibonacci(n-2)
  }
Run Code Online (Sandbox Code Playgroud)

可能我没有看到正在应用的所有"简化".但是,我无法弄清楚这val条线的终点= Memo {.因此,如果更详细地输入,也许我会理解正在构建备忘录的"跳跃".

非常感谢对此提供的任何帮助.谢谢.

scala map memoization

7
推荐指数
4
解决办法
1217
查看次数

在Scala中使用带有Hashtable的val可以解决并发问题吗?

我尽量避免代码中的变量,以便更容易地进行多线程处理.但是,有一行代码开始:

val positions: Hashtable[String, String] ...
Run Code Online (Sandbox Code Playgroud)

我想知道val是否使自动线程安全,或者是否需要担心更多细节?

scala

3
推荐指数
1
解决办法
373
查看次数

为什么Scala中的这个函数调用没有被优化掉?

我正在使用Scala 2.10.3运行此程序:

object Test {
  def main(args: Array[String]) { 
    def factorial(x: BigInt): BigInt = 
      if (x == 0) 1 else x * factorial(x - 1)

    val N = 1000
    val t = new Array[Long](N)
    var r: BigInt = 0

    for (i <- 0 until N) {
      val t0 = System.nanoTime()

      r = r + factorial(300)
      t(i) = System.nanoTime()-t0
    }

    val ts = t.sortWith((x, y) => x < y)

    for (i <- 0 to 10)
      print(ts(i) + "  ")

    println("***  " …
Run Code Online (Sandbox Code Playgroud)

optimization benchmarking scala

3
推荐指数
1
解决办法
254
查看次数

只执行一次函数并在 Scala 中缓存值

我有这样的功能

def runOnce(request: Request): Future[Result] = {
}
Run Code Online (Sandbox Code Playgroud)

当我调用这个 runOnce 函数时,如果它尚未运行,我希望它运行某个方法并返回该结果。如果它已经运行,我只希望它返回原始结果(传入的请求将是相同的)。

如果我没有像这样的参数,我可以做到

lazy val hydratedModel = hydrateImpl(request)

future for efficient filtering
def fetchHydratedModel(): Future[HydratedModelRequest] = {
   hydratedModel
}
Run Code Online (Sandbox Code Playgroud)

第一种情况怎么办?

scala

3
推荐指数
1
解决办法
2525
查看次数

在 Scala 中使用 Memo.mutableHashMapMemo 进行斐波那契记忆化

我正在尝试在 Scala 中使用记忆功能实现斐波那契函数

这里给出的一个例子使用了一个 case 语句: 在 Scala 中是否有一种通用的记忆方法?

import scalaz.Memo
lazy val fib: Int => BigInt = Memo.mutableHashMapMemo {
  case 0 => 0
  case 1 => 1
  case n => fib(n-2) + fib(n-1)
}
Run Code Online (Sandbox Code Playgroud)

似乎该变量n被隐式定义为第一个参数,但是如果我替换n_

此外,lazy关键字在这里有什么优势,因为该函数在使用和不使用此关键字的情况下似乎同样有效。

但是,我想将其概括为具有适当类型的更通用的函数定义

import scalaz.Memo
def fibonachi(n: Int) : Int = Memo.mutableHashMapMemo[Int, Int] {
    var value : Int = 0
    if( n <= 1 ) { value = n; }
    else         { value = fibonachi(n-1) + fibonachi(n-2) } …
Run Code Online (Sandbox Code Playgroud)

scala memoization fibonacci scalaz

1
推荐指数
1
解决办法
457
查看次数