Levenshtein distance: Difference between revisions

Content added Content deleted
(Added Frink)
Line 265: Line 265:
every process(!&input)
every process(!&input)
end
end

procedure process(s)
procedure process(s)
s ? (s1 := tab(upto(' \t')), s2 := (tab(many(' \t')), tab(0))) | fail
s ? {
write("'",s1,"' -> '",s2,"' = ", levenshtein(s1,s2))
s1 := tab(upto(' \t')) | fail
s2 := (tab(many(' \t')), tab(0))
write("'",s1,"' -> '",s2,"' = ", levenshtein(s1,s2))
}
end
end

procedure levenshtein(s, t)
procedure levenshtein(s, t)
if *s = 0 then return *t
if (n := *s+1) = 1 then return *t
if *t = 0 then return *s
if (m := *t+1) = 1 then return *s
n := *s+1
m := *t+1
every !(d := list(n,0)) := list(m, 0)
every !(d := list(n,0)) := list(m, 0)
every i := 1 to max(n,m) do d[i,1] := d[1,i] := i
every i := 1 to max(n,m) do d[i,1] := d[1,i] := i
Line 285: Line 280:
min(d[iM1,j], d[i,jM1:=j-1],
min(d[iM1,j], d[i,jM1:=j-1],
d[iM1,jM1] + if s_i == t[jM1] then -1 else 0) + 1
d[iM1,jM1] + if s_i == t[jM1] then -1 else 0) + 1

return d[n,m]-1
return d[n,m]-1
end</lang>
end</lang>