Как создать хэши, чувствительные к локальности?

У меня уже есть алгоритм для создания хэшей, чувствительных к локальности, но как мне их объединить, чтобы воспользоваться их характеристиками (т. Е. Похожие элементы имеют близкие хэши (с расстоянием Хэмминга))?

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

Я пытался найти это, но я не уверен, как применить к моему случаю любой из методов, которые я нашел (например, метод multi-probe). Ни один из этих методов не выглядит легко подключаемым, если у вас уже есть хэши. Есть ли простой пример кода для этого? Или любое предложение?

Это ссылка на страницу с кодом Matlab, о котором я говорю: http://www.eecs.berkeley.edu/~kulis/klsh/klsh.htm

1 ответ

Основываясь на: Поиск в хешировании, чувствительном к локальности, я бы сказал это, прочитав " Методы оценки подобия из алгоритмов округления":

Этот вопрос довольно широкий, поэтому я просто приведу здесь минимальный (абстрактный) пример:

У нас 6 (= n) векторов в нашем наборе данных, с d биты каждый. Давайте предположим, что мы делаем 2 (= N случайная перестановка.

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

v1
v5
v0
v3
v2
v4

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

Тем не менее, мы собираемся в конечном итоге между двумя векторами. Итак, теперь мы можем представить себе такой сценарий (например, q лежит между v0 и v3:

v1
v5
v0 <-- up pointer
   <-- q lies here
v3 <-- down pointer
v2
v4

Теперь мы перемещаем указатель вверх или вниз, ища вектор vi, который будет соответствовать максимум битам с q, Допустим, это был v0.

Точно так же мы делаем вторую перестановку и находим вектор vi, скажем, v4. теперь мы сравним v0 из первой перестановки и v4, чтобы увидеть, какая из них ближе всего к q то есть, какой из них имеет наибольшее количество бит, равное q,


Однако, если вы ищете готовую реализацию, вы должны спросить об этом в Рекомендации по программному обеспечению. Я также посмотрел бы на статью, на которую я ссылался, чтобы узнать, обнародовали ли авторы код или они хотели бы поделиться им после контакта с ними.

Другие вопросы по тегам