На основе: Поиск в локально-чувствительном хешировании Я бы сказал это после прочтения Методы оценки подобия из алгоритмов округления :
Этот вопрос довольно широкий, поэтому я просто приведу здесь минимальный (абстрактный) пример:
У нас есть 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
.
Однако, если вы ищете готовую реализацию, вам следует спросить в Рекомендация по программному обеспечению . Я также посмотрел бы на статью, на которую я ссылался, чтобы узнать, обнародовали ли авторы код или они хотели бы поделиться им после обращения к ним.