Физическое расстояние между двумя местами

Вот что я написал для своего проекта:

var glob = require('glob');
var minimatch = require("minimatch");

function globArray(patterns, options) {
  var i, list = [];
  if (!Array.isArray(patterns)) {
    patterns = [patterns];
  }

  patterns.forEach(function (pattern) {
    if (pattern[0] === "!") {
      i = list.length-1;
      while( i > -1) {
        if (!minimatch(list[i], pattern)) {
          list.splice(i,1);
        }
        i--;
      }

    }
    else {
      var newList = glob.sync(pattern, options);
      newList.forEach(function(item){
        if (list.indexOf(item)===-1) {
          list.push(item);
        }
      });
    }
  });

  return list;
}

И назовите это так (Используя массив):

var paths = globArray(["**/*.css","**/*.js","!**/one.js"], {cwd: srcPath});

или вот это (Используя одну строку):

var paths = globArray("**/*.js", {cwd: srcPath});
9
задан Lundin 2 July 2013 в 06:21
поделиться

6 ответов

Посмотрите на расстояние Левенштейна . Это способ измерить, насколько две строки отличаются друг от друга.

Надеюсь, я правильно понял ваш вопрос; использование «расстояния» в одном предложении с «широтой и долготой» может сбивать с толку!

6
ответ дан 4 December 2019 в 20:24
поделиться

Хотя написано на c (с привязками python и tcl), libdistance может быть инструментом для применения нескольких метрик расстояния к строкам / данным.

Включенные метрики:

  • Блум
  • Дамерау
  • Евклид
  • Хэмминг
  • Жаккар
  • Левенштейн
  • Манхэттен
  • Минковский
  • Needleman_wunsch
4
ответ дан 4 December 2019 в 20:24
поделиться

Вы можете получить неплохие результаты, используя фонетический алгоритм , чтобы найти имена с небольшими ошибками.

Кроме того, если вы используете более механическое расстояние редактирования, вы, вероятно, увидеть лучшие результаты, используя взвешенную функцию, которая учитывает геометрию клавиатуры (т.е. физически близкие клавиши «дешевле» заменить, чем удаленные). Кстати, это запатентованный метод, так что будьте осторожны, чтобы не написать то, что станет слишком популярным;)

1
ответ дан 4 December 2019 в 20:24
поделиться

Я взял на себя смелость перевести кусок кода C #, который я написал для вычисления расстояния Левенштейна, в код Java. Он использует только два одномерных массива, которые чередуются вместо большого массива с зазубринами:

public static int getDifference(String a, String b)
{
    // Minimize the amount of storage needed:
    if (a.length() > b.length())
    {
        // Swap:
        String x = a;
        a = b;
        b = x;
    }

    // Store only two rows of the matrix, instead of a big one
    int[] mat1 = new int[a.length() + 1];
    int[] mat2 = new int[a.length() + 1];

    int i;
    int j;

    for (i = 1; i <= a.length(); i++)
        mat1[i] = i;

    mat2[0] = 1;

    for (j = 1; j <= b.length(); j++)
    {
        for (i = 1; i <= a.length(); i++)
        {
            int c = (a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1);

            mat2[i] =
                Math.min(mat1[i - 1] + c,
                Math.min(mat1[i] + 1, mat2[i - 1] + 1));
        }

        // Swap:
        int[] x = mat1;
        mat1 = mat2;
        mat2 = x;

        mat2[0] = mat1[0] + 1;
    }

    // It's row #1 because we swap rows at the end of each outer loop,
    // as we are to return the last number on the lowest row
    return mat1[a.length()];
}

Он не был тщательно протестирован, но, похоже, работает нормально. Он был основан на реализации Python, которую я сделал для университетского упражнения. Надеюсь, это поможет!

0
ответ дан 4 December 2019 в 20:24
поделиться

Я нашел SumMetrics в Java, но не использовал его.

0
ответ дан 4 December 2019 в 20:24
поделиться

Я бы порекомендовал либо Расстояние Левенштейна , либо ] Расстояние Жаккара для сравнения текста.

0
ответ дан 4 December 2019 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: