【问题标题】:Longest common subsequence (Haskell)最长公共子序列(Haskell)
【发布时间】:2011-09-30 21:12:46
【问题描述】:

我已经为此苦苦挣扎了一段时间。我正在解决 Haskell 中最长的公共子序列问题作为学习练习。

我有一个函数f1,它传递了两个整数ij,还有一个函数f2f1 构建一个二维列表,使得列表中的 (i,j) 位置等于 f2 i j

现在我正在尝试编写一个名为lcs 的函数,它接受两个字符串s1s2,并使用f1 查找最长的公共子序列以进行记忆。

我不确定如何设置。有什么想法吗?

代码:

f1 :: Int -> Int -> (Int -> Int -> a) -> [[a]]

f2 :: Int -> Int -> a

lcs:: String -> String -> Int

【问题讨论】:

  • 我不完全明白f1f2 的作用。是否可以发布代码?以下是我理解的类型签名:f1 :: Int -> Int -> a; f2 :: Int -> Int -> a。有什么区别?
  • @AndresRiofrio:也许 xcross 的意思是 f1 :: (Int -> Int -> a) -> [[a]] s.t. f1 f2 !! i !! j == f2 i j.
  • @rampion:f1 :: Int -> Int -> (Int -> Int -> a) -> [[a]]f2 :: Int -> Int -> a 怎么样?这样f1 _ _ f2 !! i !! j == f2 i j.
  • @AndresRiofrio 添加了一些代码。谢谢大家。
  • 先递归求解(如维基百科上的定义(未实现)),不用担心指数时间。然后,在正确实施之后,返回并记忆(有各种技术,但这是另一个 SO 问题的素材)。

标签: haskell


【解决方案1】:

我假设f1Int 参数是某种界限?请记住,使用列表的好处是不需要指定边界(因为懒惰),但会降低访问时间。

这个函数应该做你想让f1做的事情(记忆一个给定的函数):

memo :: (Int -> Int -> a) -> (Int -> Int -> a)
memo f = index where
  index x y = (m !! x) !! y
  m         = [[f x y|y <- [0..]]|x <- [0..]]

-- memoized version of f2
f2' = memo f2

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2011-02-25
    • 2013-02-13
    • 1970-01-01
    • 2012-08-29
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多