【问题标题】:Scala streams with array/vector performance characteristics具有数组/向量性能特征的 Scala 流
【发布时间】:2017-02-08 01:44:07
【问题描述】:

我正在上一门算法课,我现在正在解决一些关于动态规划的练习。

我查看了如何在 Scala 中以函数式方式解决一些问题,从我从标准库的 scaladoc 中阅读的内容中,我发现流、视图和迭代器可能是合理的。

但是我会使用大量随机访问,因此 Streams 的效率会非常低,因为单链表需要 O(n) 时间进行索引访问。据我所知,视图不能用于构建无限的东西,并且可以无限的迭代器不会在其内部存储任何值。

然后,我从haskell wiki 找到了这个,这正是我需要的,除了它在 Haskell 中:

import Data.Array
import Control.Monad(guard,mplus)

buy n = r!n
    where r = listArray (0,n) (Just (0,0,0) : map f [1..n])
          f i = do (x,y,z) <- attempt (i-6)
                   return (x+1,y,z)
                `mplus`
                do (x,y,z) <- attempt (i-9)
                   return (x,y+1,z)
                `mplus`
                do (x,y,z) <- attempt (i-20)
                   return (x,y,z+1)
          attempt x = guard (x>=0) >> r!x

将其转换为 Scala 的好方法是什么?我有一种感觉,我需要导入一个外部库(如 scalaz)(但我将无法提交作业)或基于 Scala Array 或 Vector 编写一个新的 Stream 实现。

提前致谢!

【问题讨论】:

    标签: scala functional-programming stream dynamic-programming


    【解决方案1】:

    据我所知,视图不能用于构建无限的东西,并且可以无限的迭代器不会在其内部存储任何值。

    Haskell 解决方案也不是无限的。

    将其转换为 Scala 的好方法是什么?

    我先定义

    class Lazy[A](calculation: => A) {
      lazy val value: A = calculation
    }
    

    =&gt; A是一个别名参数,这意味着当你写val x = Lazy { ... }时,...里面的代码不会立即执行;而是在访问value 时。

    然后使用Array[Lazy[A]]Array[Lazy[(Int, Int, Int)]] 用于此特定功能)。

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2011-09-08
      • 1970-01-01
      • 2020-03-01
      • 2016-01-15
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      相关资源
      最近更新 更多