Scheme 如何改进此算法(LCS)
我不想让它一遍遍地跑 问候,,Scheme 如何改进此算法(LCS),scheme,Scheme,我不想让它一遍遍地跑 问候,, 超常规我知道这应该是两个列表中最长的公共子序列。正如你所说的,它相当慢。如果你想让它工作得更快,你需要采取一种更复杂的方法,而不是像这样粗暴地强迫它;规范解是中描述的动态规划算法 在不完全切换到另一种算法的情况下,可以大大加快解决方案的速度的一种方法是通过计算结果,因为在递归和从列表末尾删除元素时,您将一次又一次地计算相同的中间结果 EDIT:一个简单的方法是使用let子句来避免在底部进行额外的工作,即 (define (lcs lst1 lst2) (
超常规我知道这应该是两个列表中最长的公共子序列。正如你所说的,它相当慢。如果你想让它工作得更快,你需要采取一种更复杂的方法,而不是像这样粗暴地强迫它;规范解是中描述的动态规划算法 在不完全切换到另一种算法的情况下,可以大大加快解决方案的速度的一种方法是通过计算结果,因为在递归和从列表末尾删除元素时,您将一次又一次地计算相同的中间结果 EDIT:一个简单的方法是使用
let
子句来避免在底部进行额外的工作,即
(define (lcs lst1 lst2)
(define (except-last-pair list)
(if (pair? (cdr list))
(cons (car list) (except-last-pair (cdr list)))
'()))
(define (car-last-pair list)
(if (pair? (cdr list))
(car-last-pair (cdr list))
(car list)))
(if (or (null? lst1) (null? lst2)) null
(if (= (car-last-pair lst1) (car-last-pair lst2))
(append (lcs (except-last-pair lst1) (except-last-pair lst2)) (cons (car-last-pair lst1) '()))
(**if (> (length (lcs lst1 (except-last-pair lst2))) (length (lcs lst2 (except-last-pair lst1))))
(lcs lst1 (except-last-pair lst2))
(lcs lst2 (except-last-pair lst1))))))**
希望它是正确的-我手边没有解释器-但你明白了。你能描述一下它的作用以及为什么你现在觉得它不好。有没有什么方法可以不用记忆或动态编程来加速它。。?。。只是我不熟悉这些概念…:S
(if (or (null? lst1) (null? lst2)) null
(let ((front1 (except-last-pair lst1)) (front2 (except-last-pair lst2)))
(if (= (car-last-pair lst1) (car-last-pair lst2))
(append (lcs front1 front2) (cons (car-last-pair lst1) '()))
(let ((sub-lcs1 (lcs lst1 front2)) (sub-lcs2 (lcs lst2 front1)))
(if (> (length sub-lcs1) (length sub-lcs2))
sub-lcs1
sub-lcs2))))