Возврат наиболее похожей битовой подписи из дерева префиксов в python

Я никогда раньше не кодировал с помощью python (я программист на Java), и я смотрю на код, который говорит, что он возвращает наиболее похожую битовую подпись/вектор в дереве префиксов. Подпись может быть, например, такой «1001». Может кто-нибудь объяснить мне, как работает код? Как он выполняет итерацию по дереву префиксов, чтобы найти наиболее похожую/ближайшую сигнатуру к сигнатуре запроса в дереве? Сходство основано на расстоянии Хэмминга.

Вот код:

class SignatureTrie:
    @staticmethod
    def getNearestSignatureKey(trie, signature):
        digitReplacement = {'0': '1', '1': '0'}
        targetKey, iteratingKey = signature.to01(), ''
        for i in range(len(targetKey)):
            iteratingKey+=targetKey[i]
            if not trie.has_prefix(iteratingKey): iteratingKey=iteratingKey[:-1]+digitReplacement[targetKey[i]]
        return iteratingKey

Вот исходный файл: https://github.com/kykamath/streaming_lsh/blob/master/streaming_lsh/classes.py

Редактировать:

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

Предположим, у меня есть следующее дерево префиксов, содержащее три строки/подписи: s1 = 1110 s2 = 1100 s3 = 1001

введите здесь описание изображения

Предположим, у меня есть входная подпись s = 1000. Теперь я хочу узнать, какой вектор в префиксе/дереве больше всего похож на входной вектор s. Поскольку s3 имеет наименьшее расстояние Хэмминга (1), я ожидаю, что код вернет вектор s3.

Что мне нужно, так это кто-то, кто объяснит мне, делает ли код то, что я от него ожидаю, и если да, то как он получает наиболее похожую сигнатуру, то есть как он проходит по дереву.

Если код не делает то, что я ожидаю, может кто-нибудь объяснить, что он делает, на приведенном мной примере?


person Jack Twain    schedule 29.07.2013    source источник


Ответы (2)


Фрагмент кода, который вы опубликовали, не выполняет поиск Trie. Вообще.

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

Для ваших выборочных данных, если бы вы искали подпись 1101, не было бы точных совпадений. Но поиск по префиксу trie вернет результаты поиска 1, 11 и 110. Поиск 1101 завершается неудачно, поэтому digitReplacement используется для замены последней 1 на 0, которая соответствует, поэтому 1100 является результатом функции getNearestSignatureKey().

Чтобы найти совпадения, сопоставление префиксов делегируется объекту trie. Этот тип данных взят из проекта Biopython и имеет код полностью на C; если вы так склонны, изучите Trie_has_prefix функцию, чтобы посмотрите, как этот тип ищет совпадающие префиксы.

Документация по этому типу данных скудна; лучшее, что у нас есть, это эта автоматически сгенерированная страница модуля:

Этот модуль реализует структуру данных trie. Это позволяет искать строку в словаре за O(M), где M — длина строки. Он также поддерживает приблизительные совпадения.

person Martijn Pieters    schedule 02.08.2013

person    schedule
comment
можете пожалуйста привести пример? потому что я не понимаю идею перелистывания. Я бы хотел, чтобы вы могли просто привести пример с подписью, такой как 10010, и деревом префиксов. - person Jack Twain; 30.07.2013
comment
Я не понимаю вашего ввода по сравнению с ожидаемым результатом. Я могу только сказать вам, что делает код. - person Benjamin Toueg; 30.07.2013