Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Calculates the Levenshtein Distance.
- *
- * @param {A1:A5} source_range Input range one.
- * @param {A1:A5} target_range Input range two.
- * @return {number} decimal representation of the % differenc
- * @customfunction
- */
- function LEVDIST(source_range, target_range) {
- if (!Array.isArray(source_range)) {
- source_range = [source_range]
- }
- if (!Array.isArray(target_range)) {
- target_range = [target_range]
- }
- source_range = source_range.flat()
- target_range = target_range.flat()
- if (source_range.length !== target_range.length) {
- throw new Error("Ranges are of different length")
- }
- const results = [];
- source_range.forEach((source, k) => {
- const target = target_range[k]
- if (source == target) results.push(1)
- if (source.length == 0) results.push(0)
- if (target.length == 0) results.push(0)
- var v0 = [];
- var v1 = [];
- var i;
- var j;
- var cost;
- for (i = 0; i < (target.length + 1); i++) {
- v0[i] = i;
- }
- for (i = 0; i < source.length; i++) {
- v1[0] = i + 1;
- for (j = 0; j < target.length; j++) {
- if (source[i] == target[j]) {
- cost = 0;
- } else {
- cost = 1;
- }
- v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);
- }
- for (j = 0; j < (target.length + 1); j++) {
- v0[j] = v1[j];
- }
- }
- results.push([(source.length - v1[target.length]) / source.length])
- })
- return results
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement