diff options
| author | TJ DeVries <devries.timothyj@gmail.com> | 2020-07-17 00:03:20 -0400 |
|---|---|---|
| committer | TJ DeVries <devries.timothyj@gmail.com> | 2020-07-17 00:03:20 -0400 |
| commit | ababfbfd88334ca6d94d5d0a8b6324dd6600d602 (patch) | |
| tree | 99dd820cca2d906175b9a645694cb778add58499 /lua/telescope/algos | |
| parent | c6f0142fc651dcbd2431630956d034c046293e7e (diff) | |
Another stream
Diffstat (limited to 'lua/telescope/algos')
| -rw-r--r-- | lua/telescope/algos/string_distance.lua | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lua/telescope/algos/string_distance.lua b/lua/telescope/algos/string_distance.lua new file mode 100644 index 0000000..de40e14 --- /dev/null +++ b/lua/telescope/algos/string_distance.lua @@ -0,0 +1,49 @@ + +local function min(a, b, c) + local min_val = a + + if b < min_val then min_val = b end + if c < min_val then min_val = c end + + return min_val + +end + +---------------------------------- +--- Levenshtein distance function. +-- @tparam string s1 +-- @tparam string s2 +-- @treturn number the levenshtein distance +-- @within Metrics +return function(s1, s2) + if s1 == s2 then return 0 end + if s1:len() == 0 then return s2:len() end + if s2:len() == 0 then return s1:len() end + if s1:len() < s2:len() then s1, s2 = s2, s1 end + + local t = {} + for i=1, #s1+1 do + t[i] = {i-1} + end + + for i=1, #s2+1 do + t[1][i] = i-1 + end + + local cost + for i=2, #s1+1 do + + for j=2, #s2+1 do + cost = (s1:sub(i-1,i-1) == s2:sub(j-1,j-1) and 0) or 1 + t[i][j] = min( + t[i-1][j] + 1, + t[i][j-1] + 1, + t[i-1][j-1] + cost) + end + + end + + return t[#s1+1][#s2+1] + +end + |
