所以我需要计算两个列表中最长的公共子序列,但它需要在多项式时间内。我唯一的问题是我不允许使用“!”一点都不这意味着我无法使用set!更改vetcor或列表的值。我找不到一个不需要二维列表或某种数组的多项式算法。有人有什么想法吗?
答案 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
。 (注意:使用像这样的函数在现实生活中几乎总是一个错误,因为正如我所说,这是非常低效的。)