计算多项式时间中Scheme中两个列表的最长公共子序列

时间:2010-11-09 01:25:30

标签: algorithm functional-programming scheme racket

所以我需要计算两个列表中最长的公共子序列,但它需要在多项式时间内。我唯一的问题是我不允许使用“!”一点都不这意味着我无法使用set!更改vetcor或列表的值。我找不到一个不需要二维列表或某种数组的多项式算法。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您不需要使用set!(或任何其他变异操作)来使用2d列表或向量。

您可以将标准动态编程算法与2d向量一起使用,但不是更改向量以插入您为给定单元格计算的值,而是使用build-vector创建一个与以下相同的新向量:旧的,除了你改变给定位置的值。

这是非常低效的,但仍然是多项式的,我认为没有懒惰或突变就不可能真正有效地做到这一点。

编辑:使用build-vector执行此操作,看起来像这样:

(build-vector n (lambda (i)
  (build-vector n (lambda (j)
    (if (and (= i x) (= j y))
        new-value
        (vector-ref (vector-ref old-vector i) j))))))

old-vector是您要复制的n*n向量,并且您希望将位置x,y的值替换为值new-value。 (注意:使用像这样的函数在现实生活中几乎总是一个错误,因为正如我所说,这是非常低效的。)