Вычисление минимального расстояния Хэмминга между строкой и набором строк

StackOverflow https://stackoverflow.com//questions/21027033

Вопрос

Бывший:Если у меня есть строка "asdf" и набор строк ("qwer", "aswr", "asdv").Расстояние Хэмминга между набором и строкой будет равно 1, поскольку "asdv" и "asdf" имеют расстояние Хэмминга один.

Легко применить грубую силу с помощью чего-то подобного

def hamming_distance(string, set):
    min = len(string)
    for element in set:
        element_distance = sum(ch1 != ch2 for ch1, ch2 in zip(string, element))
        if min > element_distance:
            min = element_distance
        if min == 0:
            break
    return min

Я думаю, что это имеет O (n * k), где n = len (строка) и k = len (набор).Однако максимальный установленный размер масштабируется с n ^ 2, что означает, что мы, по сути, имеем дело с O (n ^ 3).Наборы довольно статичны, так что, если предварительная обработка поможет, это определенно вариант.

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

Это было полезно?

Решение

Прежде всего, расстояние Хэмминга между строками - это метрика.Таким образом, вы пытаетесь найти k ближайших соседей в метрическом пространстве (где k = 1).

Следовательно, вы можете захотеть рассмотреть дерево, аналогичное структуре данных M-Tree:(см . http://en.wikipedia.org/wiki/M-tree и http://www.vldb.org/conf/1997/P426.PDF ).Это дерево предназначено для уменьшения количества сравнений расстояний, которые необходимо выполнить, чтобы найти "ближайших соседей".

Лично я не смог найти в Интернете реализацию M-Tree, которая меня удовлетворила (см. Мой закрытый поток в поисках зрелой реализации M-Tree), поэтому я создал свою собственную.

Моя реализация находится здесь: https://github.com/jon1van/MTreeMapRepo

ЕДИНСТВЕННОЙ другой реализацией, которую я смог найти, была эта: https://github.com/erdavila/M-Tree Мне не понравилась эта реализация, потому что в ней не было функции удаления (и нескольких других проблем) (но она была бесплатной, так что ... это хорошо).

Возможно, вы захотите рассмотреть возможность использования моего кода (который решает поиск kNN в общем метрическом пространстве) с метрикой расстояния Левенштейна (http://en.wikipedia.org/wiki/Levenshtein_distance).Найти полностью реализованную метрику расстояния Левенштейна онлайн должно быть довольно просто

Добавлена функция расстояния Левенштейна ** http://code.google.com/p/google-refine/source/browse/trunk/src/main/java/edu/mit/simile/vicino/distances/LevensteinDistance.java?r=181

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top