【问题标题】:Dynamic programming with Data.Vector使用 Data.Vector 进行动态编程
【发布时间】:2010-09-07 13:51:12
【问题描述】:

我正在使用 Data.Vector,并且目前需要计算用于计算加密哈希 (Sha1) 的向量的内容。我创建了以下代码。

dynamic :: a -> Int -> (Int -> Vector a -> a) -> Vector a
dynamic e n f = 
let 
    start = Data.Vector.replicate n e   
in step start 0
where
    step vector i = if i==n then vector
                    else step (vector // [(i,f i vector)]) (i+1)

我创建了这个,以便填充向量的函数 f 可以访问部分 一路走来的结果。 Data.Vector 中肯定已经存在类似的东西,不是吗?

问题陈述如下:你要解决一个动态规划问题,其中完成的结果是一个数组。你知道数组大小的大小,并且你有一个递归函数来填充它。

【问题讨论】:

  • 最后一行中出现的n不应该都是i吗?

标签: arrays haskell vector memoization


【解决方案1】:

您可能已经看到函数generate,它接受大小n 和类型为Int -> a 的函数f,然后生成大小为nVector a。您可能不知道的是,在使用此功能时,您实际上可以访问部分结果。

我的意思是,在您传递给generate 的函数内部,您可以引用您正在定义的向量,并且由于 Haskell 的懒惰,它可以正常工作(除非您使当然,向量以循环方式相互依赖)。

例子:

import Data.Vector

tenFibs = generate 10 fib
    where fib 0 = 0
          fib 1 = 1
          fib n = tenFibs ! (n-1) + tenFibs ! (n-2)

tenFibs 现在是一个包含前 10 个斐波那契数的向量。

【讨论】:

    【解决方案2】:

    也许您可以使用 Data.Vector 的扫描功能之一? http://hackage.haskell.org/packages/archive/vector/0.6.0.2/doc/html/Data-Vector.html#32

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多