2010-11-07 2 views
0

У меня есть программа, в которой мне нужно рассчитать несколько раз расстояние Левенштейна между парами слов (одно из них зафиксировано) и несколько раз может варьироваться от примерно От 1000 до 120000 для каждого фиксированного слова. Поскольку я хочу оптимизировать эту программу, насколько я могу подумать о реализации этих вычислений в сборке. Проблема в том, что я ничего не знаю о сборке, кроме теории, и что она может представлять собой большие улучшения скорости. Может ли кто-нибудь помочь мне или предоставить мне код сборки для этого расстояния? Кроме того, как я могу вызвать сборку из модуля C#?Levenshtein (или Damerau-Levenshtein, если возможно!) Distance is Assembly

+0

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

+0

Возможно, вам следует реализовать это на C# сначала (или использовать библиотеку C#), прежде чем изучать язык ассемблера. В конце концов, код C# может быть достаточно быстрым для ваших нужд. –

+0

Учитывая, что вы не знаете сборки, это, вероятно, не самый лучший выбор, так как оптимизация кода ассемблера требует хороших знаний о сборке и оборудовании. –

ответ

1

Вы можете легко использовать BK-tree, чтобы создать дерево поиска, если Levenshtein достаточно. Дамарау-Левенштейн can not be used with a metric tree.

Вам не нужно писать эту реализацию на ассемблере или C#, вы можете далеко продвинуться, используя небезопасный код и указатели.

  • Чтение и кэш str.Length, те вызовы методов (наиболее вероятно, встраиваемые/Оптимизированные)
  • Access ваши строки с указателями.
  • Вы можете создать свою таблицу/массив/состояние как int [rows * cols] вместо int [rows] [cols] и использовать указатели для чтения/записи.
    int[] state = new int[rows*cols]
    fixed(int* ptrState=state)
  • Вы действительно не нужны больше, чем две строки в вашей таблице состояний, то есть тот, который вы прочитаны, и тот, который вы пишете в. Затем поменяйте указатели и прочитайте то, что вы только что написали.
  • Я верю, что можно оптимизировать путем удаления идентичных префиксов/суффиксов
    L('catz', 'cats') == L('z', 's') == 1
    L('rats', 'cats') == L('r', 'c') == 1
Смежные вопросы