Scala流具有数组/向量性能特征

时间:2017-02-08 01:44:08

标签: scala functional-programming stream dynamic-programming

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

我查看了如何在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实现。

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

据我所知,视图无法用于构建无限的东西,而迭代器可以是无限的,不会将任何值存储在自身内。

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

  

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

我从定义

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

=> A是一个按名称参数,这意味着当您编写val x = Lazy { ... }时,...内的代码不会立即执行;相反,它将在访问value时。

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