Как найти наиболее похожий битовый вектор в префиксном дереве для NN-поиска?
Проблема, которую я пытаюсь решить, объясняется в этом вопросе: Найти единственного ближайшего соседа, используя дерево префиксов в O(1)?
Мой вопрос касается раздела " Предлагаемое решение " на этой странице вопросов. В этом разделе упоминается, что мы находим ближайшего соседа из каждого дерева префиксов, обходя дерево, начиная с узла. Хорошо посмотреть, существует ли ключ в дереве префиксов, просто, но получить самый похожий, которого я совсем не понимаю. Как это сделать?
Я хотел бы, если кто-то может объяснить это мне, если не графически (что является предпочтительным), то хотя бы с некоторыми деталями.
Редактировать:
вот код бумаги. Он написан на python, и, к сожалению, я никогда раньше не работал с python. Если кто-то знаком с Python и может найти код, чтобы увидеть, как они находят ближайших соседей, используя префиксные деревья. https://github.com/kykamath/streaming_lsh/blob/master/streaming_lsh/nearest_neighbor_lsh.py
https://github.com/kykamath/streaming_lsh/blob/master/streaming_lsh/classes.py
1 ответ
Сначала узнайте, что они перебирают все дерево. Итерируя по всему дереву, они гарантированно находят наиболее похожих соседей.
Для большей эффективности в среднем случае используйте обход дерева DFS для дерева. Обратите внимание, что, поскольку это дерево, не будет необходимости в схеме раскраски для посещаемых узлов.
Начните с ближайшего объекта с нуля и с корня дерева.
Для каждого узла вы должны перемещать дочерние элементы в порядке их добавления к расстоянию редактирования и только в том случае, если добавленное расстояние редактирования не будет больше расстояния до ближайшего объекта. Например, с расстоянием Хэмминга сначала пройдитесь по дочернему элементу, который добавит "O" к общему расстоянию, а затем пройдитесь по дочернему элементу, который добавит "1" к общему расстоянию. Но не переходите к дочернему элементу "1", если это сделает расстояние редактирования больше текущего ближайшего расстояния.
Когда вы встретите "слово" в дереве префиксов, проверьте, имеет ли оно расстояние до объекта запроса меньше, чем ближайший объект, и назначьте его ближайшему.