chibi-scheme/lib/chibi/edit-distance.sld
2019-11-04 20:15:32 +08:00

32 lines
1.3 KiB
Scheme

(define-library (chibi edit-distance)
(export edit-distance)
(import (scheme base) (srfi 130))
(begin
;; levenshtein (quadratic time, linear memory)
(define (edit-distance s1 s2)
(let* ((len1 (string-length s1))
(len2 (string-length s2))
(vec (make-vector (+ len1 1) 0)))
(do ((i 0 (+ i 1)))
((> i len1))
(vector-set! vec i i))
(do ((i 1 (+ i 1))
(sc2 (string-cursor-start s2) (string-cursor-next s2 sc2)))
((> i len2)
(vector-ref vec len1))
(vector-set! vec 0 i)
(let ((ch2 (string-ref/cursor s2 sc2)))
(let lp ((j 1)
(sc1 (string-cursor-start s1))
(last-diag (- i 1)))
(when (<= j len1)
(let ((old-diag (vector-ref vec j))
(ch1 (string-ref/cursor s1 sc1)))
(vector-set! vec j (min (+ (vector-ref vec j) 1)
(+ (vector-ref vec (- j 1)) 1)
(+ last-diag
(if (eqv? ch1 ch2) 0 1))))
(lp (+ j 1)
(string-cursor-next s1 sc1)
old-diag))))))))))