2014-12-09 6 views
4

Я пытаюсь количественно определить разницу между двумя строками как часть системы мониторинга изменений.Быстрая приблизительная разность строк для больших строк

Проблема, которая возникает у меня, это то, что строки big - Я часто могу иметь дело со строками с символами 100K +.

В настоящее время я использую расстояние Левенштейна, но вычисление расстояния levenshtein для больших струн очень неэффективно. Даже самые лучшие реализации управляют только O(min(mn)).

Поскольку обе строки имеют примерно одинаковую длину, процесс вычисления расстояния может занять много секунд.

Мне не нужна высокая точность. Для моего приложения было бы достаточно разрешения на изменение 1 в 1000 (например, 0,1%).

Какие существуют варианты для более эффективного вычисления расстояния по струнам?

+0

Aaaand stackoverflow не имеет mathjax. WTF? –

+0

http://meta.stackexchange.com/questions/30559/latex-on-stack-overflow –

+0

Интересный вопрос! Осуществляете ли вы левенштинское расстояние, создавая матрицу? Это может быть медленным. Теперь вы не указали, какой язык вы используете, но если вы создаете массив байтов каждой строки, возможно, вы можете просто перебирать их через них? Я имею в виду, что итерации по 100 КБ должны быть довольно быстрыми, если бы вы могли иметь дело с получением числа 'd' - разницы в символах. Однако я думаю, что вы не можете получить более низкую временную сложность, но вы можете получить постоянную память, если используете, например, Java, что обеспечит более быструю практическую реализацию. –

ответ

0

Если вы можете терпеть некоторую ошибку, вы можете попробовать разбивать строки на более мелкие куски и рассчитать их попарные L-расстояния.

метод, очевидно, дает точный результат для замены, вставки и удаление будет нести точность штраф в зависимости от количества кусков (наихудший сценарий даст вам расстояние 2 * <number of insert/deletes> * <number of chunks> вместо <number of insert/deletes>)

Следующего шага может быть, чтобы сделать процесс адаптивным, я вижу два способа сделать это, в зависимости от ожидаемого характера изменений:

  1. Попробуйте небольшой размер порции первым затем перейти на более крупные и более крупные куски и наблюдать падение между каждым итерация. Это должно помочь вам оценить, сколько из вашего измеренного расстояния является ошибкой (хотя я точно не определил, как именно).
  2. Как только вы обнаружите разницу между двумя кусками, попробуйте определить, в чем состоит разница (точно, сколько символов было добавлено/удалено в целом) и переместите следующий фрагмент влево или вправо соответственно.
Смежные вопросы